Удаление index.html из URL и добавление www одним перенаправлением 301 - PullRequest
3 голосов
/ 19 мая 2011

Чтобы удалить index.html или index.htm из URL, я использую следующее в моем .htaccess

RewriteCond %{REQUEST_URI} /index\.html?$ [NC]
RewriteRule ^(.*)index\.html?$ "/$1" [NC,R=301,NE,L]

Это работает! (Подробнее о флагах в конце этого вопроса *)

Затем, чтобы добавить www в URL, я использую следующее в моем .htaccess

RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$ [NC]
RewriteRule ^(.*)$ "http://www.mydomain.com/$1" [R=301,NE,L]

Это тоже работает!

Вопрос здесь , как избежать двойного перенаправления, созданного правилами выше в случаях, подобных приведенному ниже:

  1. браузеры запрашивают http://mydomain.com/path/index.html
  2. сервер отправляет заголовок 301 в браузер перенаправления на http://mydomain.com/path/
  3. затем браузер запрашивает http://mydomain.com/path/
  4. теперь сервер отправляет заголовок 301 в браузер перенаправления на http://www.mydomain.com/path/

Это явно не очень умно, потому что бедный пользователь, который спрашивает http://mydomain.com/path/index.html, будет перенаправлен дважды, и он будет чувствовать, что страница идет слишком медленно Более того, робот Google может прекратить переход по причине ссылки на двойное перенаправление (я не уверен в этом последнем и не хочу вступать в дискуссию по этому вопросу, это просто еще одна возможная проблема).

Спасибо!


* Кому это может быть интересно:

  • NC используется также для перенаправления файлы в верхнем регистре, т.е. INDEX.HTML / InDeX.HtM
  • NE используется чтобы избежать двойного кодирования URL я избегаю http://.../index.html?hello=ba%20be быть перенаправленным на http://.../index.html?hello=ba%2520be
  • QSA используется для перенаправления также запросы, т.е. http://.../index.html?hello=babe до http://.../?hello=babe (не требуется благодаря anubhava answer )

Ответы [ 3 ]

6 голосов
/ 19 мая 2011

Чтобы избежать двойного перенаправления, в файле .htaccess есть другое правило, которое удовлетворяет обоим следующим условиям:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . http://www.%{HTTP_HOST}%1 [R=301,NE,L]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule . http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L]

RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]

Так что, если входной URL равен http://mydomain.com/path/index.html, тогда оба условия удовлетворяются в первом правиле здесь ибудет 1 единичное перенаправление (301) на http://www.mydomain.com/path/.

Также я считаю, что флаг QSA на самом деле не нужен выше, поскольку вы НЕ манипулируете строкой запроса.

2 голосов
/ 09 декабря 2012

Лучшим решением было бы поместить правило index.html перед правилом www и внутри правила index.html ДОБАВИТЬ префикс www к URL-адресу назначения.Таким образом, кто-то ищет http://domain.com/index.html будет отправлен на http://www.domain.com/ по правилу FIRST.Второе правило (www) будет применяться только в том случае, если отсутствуют индекс AND www, что опять-таки является только одним перенаправлением.

0 голосов
/ 19 мая 2011

Удалить флаг L из предыдущего правила? L принудительно останавливает синтаксический анализ правила (при сопоставлении правила) и, таким образом, отправляет первый переписанный URL-адрес без применения второго правила.

Правила применяются последовательно сверху вниз, каждый раз перезаписывая URL снова , если он соответствует условиям и шаблону правила.

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]

RewriteRule ^(.*/)index\.html?$ $1 [NC,QSA,R=301,NE,L]

Следовательно, приведенное выше сначала добавит www, а затем удалит index.html? перед отправкой нового URL; Один редирект для всех правил.

...