Объединение правил переименования .htaccess - нужна ли директива [L]?

Я конвертирую свой сайт в ] 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]
1
задан 12 July 2017 в 22:29
1 ответ

Да, флаг 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 ), которое запускается немедленно.

1
ответ дан 3 December 2019 в 23:28

Теги

Похожие вопросы