У меня есть основной домен, несколько дополнительных доменов и недавно перешел на HTTPS. Для меня это работает нормально, но мне хотелось бы узнать ваше мнение:
## All http requests to the relative https url
RewriteCond %{SERVER_PORT} 80 [OR]
## redirect the other domains and the non www main main domain
RewriteCond %{HTTP_HOST} ^domain3.com [OR]
RewriteCond %{HTTP_HOST} ^www.domain3.com [OR]
RewriteCond %{HTTP_HOST} ^domain2.com [OR]
RewriteCond %{HTTP_HOST} ^www.domain2.com [OR]
RewriteCond %{HTTP_HOST} ^maindomain.com
## this stuff is for SSL
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
## i send them all to the https main domain
RewriteRule ^(.*)$ https://www.maindomain.com/$1 [L,R=301]
Это лучший подход к созданию правила перезаписи для каждого условия?
Определенно нет необходимости в нескольких директивах RewriteRule
. Это только усложнит ситуацию и будет менее эффективным. Если у вас есть несколько правил (для каждого условия), то каждое правило, по крайней мере, будет обработано, даже если вы уже были на каноническом протоколе + хост.
Однако, похоже, вы перенаправляете каждый другой домен . Все, что есть , а не www.maindomain.com
. Если это так, то вы можете упростить это правило и избавиться от множества условий . Например:
## All http requests to the relative https url
RewriteCond %{SERVER_PORT} 80 [OR]
## redirect all the other non-canonical domains
RewriteCond %{HTTP_HOST} !^www\.maindomain\.com
## this stuff is for SSL
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
## i send them all to the https main domain
RewriteRule (.*) https://www.maindomain.com/$1 [L,R=301]
Итак, теперь это говорит ... если HTTP или нет www.maindomain.com
, то перенаправьте на HTTPS и www.maindomain.com
. Вместо того, чтобы специально проверять каждый неканонический хост, вы просто проверяете, не является ли он каноническим хостом.
Нет необходимости в начальных и конечных якорях, если вы в любом случае захватываете весь URL-путь. т.е. (. *)
совпадает с ^ (. *) $
.
Или вы можете избежать захвата регулярным выражением и просто использовать ] REQUEST_URI
вместо серверной переменной (которая начинается с косой черты). Например:
RewriteRule ^ https://www.maindomain.com%{REQUEST_URI} [L,R=301]
## этот материал для SSL RewriteCond% {REQUEST_URI}! ^ / [0-9] + \ .. + \. Cpaneldcv $ RewriteCond% {REQUEST_URI}! ^ / [A-F0-9] {32} \. Txt (?: \ Comodo \ DCV)? $
Это похоже на карбункул, который cPanel (автоматически) вводит перед каждым RewriteRule
при обновлении сертификатов SSL. Если у вас много директив RewriteRule
в .htaccess
, это делает файл .htaccess
невероятно раздутым. (Он также может выявить уязвимости, которые ранее не были очевидны.) Я не знаю, почему они не разделяют эти условия в один блок в начале файла и вместо этого не инвертируют (т.е. инвертируют) их? Например:
# START: this stuff is for SSL
RewriteCond %{REQUEST_URI} ^/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} ^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
# END: this stuff is for SSL
## All http requests to the relative https url
RewriteCond %{SERVER_PORT} 80 [OR]
## redirect all the other non-canonical domains
RewriteCond %{HTTP_HOST} !^www\.maindomain\.com
## i send them all to the https main domain
RewriteRule (.*) https://www.maindomain.com/$1 [L,R=301]