Uma regra de reescrita ou múltiplas regras no htaccess

1

Eu tenho um domínio principal, um par de domínios addon e recentemente fui HTTPS. Isso está funcionando bem para mim, mas eu gostaria da sua opinião:

## 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]

Esta é uma abordagem melhor para ter uma regra de reescrita para cada condição?

    
por Aramil 08.04.2017 / 00:04

1 resposta

1

Certamente não há necessidade de várias diretivas RewriteRule . Isso só complicaria as coisas e seria menos eficiente. Se você tiver várias regras (para cada condição), cada regra será processada, pelo menos, mesmo se você já estivesse no protocolo canônico + host.

No entanto, parece que você está redirecionando todos os outros domínios. Tudo que é não www.maindomain.com . Se este for o caso, você pode simplificar esta regra e acabar com as várias condições . Por exemplo:

## 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]

Então, isso agora diz ... se HTTP ou não www.maindomain.com redireciona para HTTPS e www.maindomain.com . Em vez de verificar especificamente cada host não canônico, você está apenas verificando se não é o host canônico.

Não é necessário usar as âncoras inicial e final se você estiver capturando todo o caminho da URL. ie. (.*) é o mesmo que ^(.*)$ .

Ou, você poderia evitar a regex capturando e apenas usar a variável REQUEST_URI server (que começa notavelmente com uma barra). Por exemplo:

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)?$

Isso se parece com o carbuncle que o cPanel (automaticamente) injeta antes de cada RewriteRule ao renovar certificados SSL. Se você tiver muitas diretivas RewriteRule em .htaccess , isso resultará em um arquivo .htaccess incrivelmente inchado. (Ele também pode expor vulnerabilidades que não eram evidentes anteriormente.) Eu não sei por que elas não separam essas condições em um único bloco no início do arquivo e negam (ou invertem) elas em vez disso? Por exemplo:

# 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]
    
por 08.04.2017 / 00:41