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

Одно или несколько правил перезаписи в 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]

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

Разумеется, нет необходимости в нескольких 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]
## this stuff is for 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]