[Помогите] Проблема с WWW -> non-WWW redirect

Тема в разделе "OpenCart", создана пользователем mr.Elias, 2 окт 2015.

  1. mr.Elias

    mr.Elias

    Регистрация:
    15 июн 2013
    Сообщения:
    319
    Симпатии:
    54
    1. При редиректе сайта с WWW на безWWW c помощью .htacceess, столкнулся с такой проблемой

    при загрузке страницы www.example.com/page получается example.com/index.php?_route_=page
    я понимаю что правило RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] не распространяется на путь который начинается с WWW.
    как это исправить?

    кусок содержимого .htacceess
    Код:
    RewriteEngine On
    
    RewriteBase /
    RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
    RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
    RewriteRule ^system/download/(.*) /index.php?route=error/not_found [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

    2. Почему-то не пашет более правильный вариант на apache c httpd
    Код:
    NameVirtualHost *:80
    <VirtualHost *:80>
      ServerName example.com
      DocumentRoot "/path/to/site"
    </VirtualHost>
    <VirtualHost *:80>
      ServerName www.example.com
      Redirect 301 / http://example.com/
    </VirtualHost>
    
    при загрузке страницы www.example.com/page получается example.compage/
    т.е. между именем сайта и страницей нет "/"

    Я предпочитаю пойти по пути №2.
    Кто сталкивался с подобной проблемой, подскажите как решить?
     
    Последнее редактирование: 2 окт 2015
  2. VaLeXaR

    VaLeXaR

    Регистрация:
    24 мар 2015
    Сообщения:
    61
    Симпатии:
    86
    А такой вариант пробовали?
    Код:
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
     
  3. mr.Elias

    mr.Elias

    Регистрация:
    15 июн 2013
    Сообщения:
    319
    Симпатии:
    54
    да пробовал самым первым, только вместо + у меня *
    Код:
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    не работает

    Повторюсь, не хотел бы делать это директивой rewrite, лучше вариант apache
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Это всё Апач. .htacceess - это конфиг Апача.
    Если хотите совсем правильно, делайте редирект через nginx:
    Код:
    server {
      listen :80;
      listen [::]:80;
      server_name www.domain.com;
      return 301 http://domain.com$request_uri;
    }
    
     
  5. VaLeXaR

    VaLeXaR

    Регистрация:
    24 мар 2015
    Сообщения:
    61
    Симпатии:
    86
    Для этого нужно иметь доступ к конфигу nginx. Не каждий хостер дает доступ к конфигу. Многие работают в связке с апачем и позволяют настаривать сервер через htaccess.
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Всё так, но если есть доступ к редактированию VirtualHost, вероятно. речь идёт о VPS/VDS. На шаредах и к VirtualHost прямого доступа нет.
     
  7. mr.Elias

    mr.Elias

    Регистрация:
    15 июн 2013
    Сообщения:
    319
    Симпатии:
    54
    Директива rewrite в 2 раза "тяжелее" redirect. потому не хочу решать через htaccess, да он и не работает.

    1。У меня VPS。
    2。Так и не увидел разумного ответа на вопрос

    Почему нельзя сделать правильно через httpd
    Почему не работает вариант с httpd?

    NameVirtualHost *:80
    <VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/path/to/site"
    </VirtualHost>
    <VirtualHost *:80>
    ServerName www.example.com
    Redirect 301 / http://example.com/
    </VirtualHost>

    почему при загрузке страницы www.example.com/page получается example.compage/
    т.е. между именем сайта и страницей нет "/"
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Это просто не нужно делать. Когда на сервер приходит запрос, его встречает nginx, а дальше уже перенаправляет на apache. Если запрос нужно перенаправить на другой домен (технически, www - это поддомен, а не просто указатель на web), нет смысла пропускать его на apache - это только лишняя нагрузка на сервер. Если зашла речь о том, что rewrite в 2 раза тяжелее redirect (кстати, можно ссылку на источник?), то любое перенаправление через apache будет глупостью, ибо можно обойтись вообще без apache, который жрёт значительно больше ресурсов, чем nginx, тем более, что nginx в любом случае уже задействован в обработке запроса! Уверен, если вы задумываетесь о таких мелочах, как производительность rewrite и redirect, у вас, конечно. наружу уже слушает nginx.

    В принципе, если так важна производительность, советую вообще отказаться от apache и использовать связку nginx + php-fpm. В отличии от apache, такая связка практически не потребляет памяти и работает молниеносно. Проверено многократно на собственном опыте, в том числе и с ОпенКартом (и все ЧПУ отлично работают).
     
  9. mr.Elias

    mr.Elias

    Регистрация:
    15 июн 2013
    Сообщения:
    319
    Симпатии:
    54
    что если послушать твой совет и пойти немного дальше, вот этим путем?
    --- Добавлено, 6 окт 2015 ---
    http://stackoverflow.com/questions/1100343/apache-redirect-from-non-www-to-www
    отсюда пошел искать и нашел несколько отличных объяснений

    то есть, по этой логике www нихрена не архаизм, как говорят многие, и лучше чтобы сайт был с www чем без www
    поскольку если будут другие поддомены у этого домена, то лучше чтобы перенаправление шло на www у apache, я верно понимаю это?
     
  10. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Это не дальше, а ближе. Я был уверен, что и так уже используется такая связка.
    Идеальный вариант это nginx + php-fpm, а nginx + apache - это минимально возможный вариант. Если есть хоть малейшая забота о потреблении ресурсов и скорости работы, apache никогда и ни при каких условиях не будет слушать наружу! А вообще, в большинстве случаев в apache совсем нет смысла. Без него нельзя было обойтись до появления php-fpm, но не сейчас.

    Нет. www - это домен третьего уровня (вместо www там может быть, например, zzz - никакой разницы). Всегда лучше, чтоб домен был как можно более высокого уровня.
     
    mr.Elias нравится это.
  11. mr.Elias

    mr.Elias

    Регистрация:
    15 июн 2013
    Сообщения:
    319
    Симпатии:
    54
    нет еще. но я на верном пути)))
    как мне кажется zzz и www - это две большие разницы как для меня так и для поисковиков. Почему же фейсбук, эпл, гугл, и так далее, все они редиректят на www.site.com?
    значит они уверены что www должно быть, по крайней мере пока что.
     
  12. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Не совсем так: https://developers.facebook.com/

    А Твиттер, например, никуда не редиректит, как и АлиЭкспресс.

    В случае ФБ www то ли используется по привычке (Твиттер и Али появились уже во времена, когда www считался архаизмом, а ФБ ещё застал времена www), то ли именно как поддомен, указывающий на пользовательскую часть (в отличии от портала для разработчиков или апи).

    С Гуглом та же история: https://developers.google.com/

    Плюс, в таких крупных корпорациях решения принимаются очень долго и требуют достаточной аргументации. Если сайт 10 лет сидел на www, решение его убрать могут принимать ещё 10 лет.