Я конвертирую свой сайт в ] ssl
. Мой htaccess в настоящее время имеет существующие правила, и я хочу добавить правило для перезаписи всех запросов http
на https
(это общий сервер, и у меня нет доступ к файлам конфигурации, так что это единственный способ).
Основными двумя рассматриваемыми правилами являются первое (с http
до https
) и последнее (удаление ] www
).
Я пытаюсь понять, что произойдет с правилами цепочки в этом случае, и если мне понадобится директива [L]
с http
в https
правило переименования. Я знаю, что директива [L]
вызовет цикл .htaccess
, и было бы более эффективно выполнить только один проход правила, если возможно. Если не используйте директиву [L]
(с правилом переименования http
в https
), будет ли правило переименования www
работать за один проход?
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
#Rules for Versioned Static Files - remove timestamp
RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L]
#rename invalid file and directory requests
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}
#direct favicon requests to img directory
RewriteCond %{REQUEST_URI} !^/img/favicon.ico [NC]
RewriteCond %{REQUEST_URI} favicon\.ico [NC]
RewriteRule (.*) https://example.com/img/favicon.ico [R=301]
# remove www.
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]
Да, флаг L
( последний
) необходим для этих внешних (канонических) перенаправлений . «Цепочка» на самом деле не используется - это внешние перенаправления - вы хотите, чтобы обработка была остановлена как можно скорее и отправила ответ перенаправления обратно клиенту. Если вы не включили флаг L
, обработка будет продолжена через файл и будет перезаписана на ваш фронт-контроллер до того, как произойдет перенаправление - что, безусловно, вы не хотите произойдет (поскольку это, скорее всего, приведет к внешнему перенаправлению на /index.php?redirectroot = ....
).
Фактически, ваши директивы расположены в неправильном порядке. Как правило, внешние перенаправления всегда должны выполняться до внутренних перезаписей . Канонические перенаправления (www и HTTPS) должны быть вместе, в верхней части файла, а не в конце.
Кроме того, перенаправление с www на не-www перенаправляет на http: //
, что находится в прямом конфликте с перенаправлением HTTP на HTTPS, что создаст ненужный цикл.
Перенаправление HTTP на HTTPS также недействительно, так как перед флагами RewriteRule
отсутствует пробел.
Итак, подведем итог:
RewriteEngine On
# remove www.
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#direct favicon requests to img directory
RewriteCond %{REQUEST_URI} !^/img/favicon.ico
RewriteRule favicon\.ico /img/favicon.ico [NC,L]
#Rules for Versioned Static Files - remove timestamp
RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L]
#rename invalid file and directory requests
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}
Включая перенаправление с www на не-www перед перенаправлением HTTPS и перенаправляя на канонический https: //
, вы избегаете двух потенциальных перенаправлений.
Флаг QSA
не требуется, если вы явно не включаете строку запроса в подстановку и не хотите объединить ее со строкой запроса в запросе. (Вы не включаете строку запроса в перенаправление с www на не-www, поэтому этот флаг не требуется.)
Я изменил ваше перенаправление на / img / favicon. ico
во внутреннюю перезапись . Не знаете, зачем вам перенаправить сюда ? Я бы также поставил под сомнение использование здесь флага NC
. Вы должны делать совпадение без учета регистра, только если это специально требуется.
Кроме того, я удалил флаг NC
из директивы negated RewriteCond
. Подумайте о логике.
Я знаю, что директива
[L]
вызовет цикл.htaccess
В контексте .htaccess
(каталог), флаг L
завершает текущий проход через файл .htaccess
. Однако обработка действительно «зацикливается» до тех пор, пока запрос не пройдет без изменений - за исключением случая внешнего перенаправления ( R = 3xx
), которое запускается немедленно.