Одно или несколько правил перезаписи в htaccess

У меня есть основной домен, несколько дополнительных доменов и недавно перешел на 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]

Это лучший подход к созданию правила перезаписи для каждого условия?

1
задан 8 April 2017 в 12:25
1 ответ

Определенно нет необходимости в нескольких директивах 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]
1
ответ дан 3 December 2019 в 23:32

Теги

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