Apache htaccess várias condições de reescrita para várias regras

2

Eu peguei um site e notei que o desenvolvedor anterior tinha várias regras de reescrita de .htaccess , este é um pequeno exemplo:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing$ landing.php?page=$1

A condição de reconfiguração é sempre a mesma para todas as regras. Existe uma maneira de combinar as regras de reconfiguração de modo que as condições tenham que ser escritas apenas uma vez?

Eu observei a bandeira de salto, mas ela não tem nenhuma referência de volta possível. Até onde eu vejo, eu não preciso de backreferences com essas condições, no entanto, é pular a melhor abordagem? Ou existe uma prática recomendada sobre como conseguir isso? (Alguém me sugeriu que usasse a bandeira do QSA, no entanto, com a pesquisa, não acho que tenha algo a ver com o que eu quero realizar.)

    
por Tom 23.11.2017 / 22:29

1 resposta

3
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

Esse bloco confuso de condições é injetado automaticamente pelo cPanel antes de cada diretiva RewriteRule quando ele renova automaticamente um certificado de segurança SSL (Let's Encrypt?). Essas condições garantem que o arquivo de validação (necessário para renovar o certificado SSL) esteja acessível.

Infelizmente, eu não fui capaz de entender por que o cPanel faz isso dessa maneira - pode ser um pesadelo de manutenção e eu encontrei diretivas que foram quebradas por essas condições (reconhecidamente as diretivas eram menos que perfeitas). começar com). (Eu tentei perguntar nos fóruns do cPanel, mas nunca tive uma boa resposta.)

...is there a way to combine the Rewrite Rules so the conditions just have to be written once?

Sim. Você pode mover essas condições para seu próprio bloco no início do arquivo .htaccess e inverter seu significado, então, em vez de apenas acionar o RewriteRule quando um pedido não corresponde ao padrão (usando um negado regex). Você pode impedir novas reescritas quando uma solicitação corresponder ao padrão. Por exemplo:

# BEGIN cPanel SSL CERT RENEWAL
RewriteCond %{REQUEST_URI} ^/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} ^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
# END cPanel SSL CERT RENEWAL

Observe a remoção do prefixo ! (negation) no CondPattern e o sinalizador OR adicional nas três primeiras condições. O RewriteRule , em seguida, impede que outras diretivas mod_rewrite sejam processadas caso a solicitação corresponda.

(No Apache 2.4.8+ estas diretivas podem ser movidas inteiramente para a configuração do servidor. Com a ajuda de RewriteOptions InheritDownBefore .)

Em seguida, seguimos apenas as diretivas RewriteRule que você tinha antes (embora eu tenha adicionado o L flag):

RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3 [L]
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2 [L]
RewriteRule ^(.*)/landing$ landing.php?page=$1 [L]

Você provavelmente deve incluir L flags nessas reescritas restantes.

Você também pode combinar essas 3 reescritas em uma única diretiva, se quiser, mas isso dependerá se o seu aplicativo manejar os parâmetros de URL vazios.

(Someone suggested to me to use the QSA flag, however, upon research I don't think that has anything to do with what I want to accomplish.)

Sim, isso não tem nada a ver com esse problema específico. O sinalizador QSA (Query String Append) permitiria mesclar qualquer string de consulta que estivesse presente na solicitação com a string de consulta que você está escrevendo na RewriteRule substituição .

    
por 24.11.2017 / 00:23