Я конвертирую свой сайт в 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
), который срабатывает немедленно.