Назад | Перейти на главную страницу

Объединение правил переименования .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]

Да, L (last) для этих внешние (канонические) перенаправления. «Цепочка» на самом деле не идет - это внешние перенаправления - вы хотите, чтобы обработка была остановлена ​​как можно скорее и отправила ответ перенаправления обратно клиенту. Если вы не добавили L flag, то обработка файла продолжится и будет перезаписана на ваш фронт-контроллер перед происходит перенаправление - чего вы, конечно, не хотите (так как это, скорее всего, приведет к внешнему перенаправлению на /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 флаг из отрицается RewriteCond директива. Подумайте о логике.

Я знаю [L] директива вызовет .htaccess петля

В .htaccess (каталог) контекст, L флаг завершает текущий проход через .htaccess файл. Однако обработка действительно "зацикливается" до тех пор, пока запрос не пройдет без изменений, за исключением случая внешнего перенаправления (R=3xx), который срабатывает немедленно.