Apache htaccess plusieurs conditions de réécriture pour plusieurs règles
J'ai repris un site Web et j'ai remarqué que le développeur précédent avait plusieurs .htaccessrègles de réécriture, voici un court exemple:
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
 
    La condition de réécriture est toujours la même pour toutes les règles, y a-t-il un moyen de combiner les règles de réécriture pour que les conditions ne soient écrites qu'une seule fois?
J'ai regardé dans le drapeau de saut mais il n'a pas de rétro-référence possible. Pour autant que je sache, je n'ai pas besoin de renvois avec ces conditions, cependant, est-ce que sauter la meilleure approche? Ou existe-t-il une meilleure pratique pour y parvenir? (Quelqu'un m'a suggéré d'utiliser le drapeau QSA, cependant, après des recherches, je ne pense pas que cela ait quoi que ce soit à voir avec ce que je veux accomplir.)
Réponses
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)?$
Ce bloc de conditions désordonné est injecté automatiquement par cPanel avant chaque RewriteRuledirective lorsqu'il renouvelle automatiquement un certificat de sécurité SSL (Let's Encrypt?). Ces conditions garantissent que le fichier de validation (nécessaire pour renouveler le certificat SSL) est accessible.
Malheureusement, je n'ai pas été en mesure de comprendre pourquoi cPanel le fait de cette façon - cela peut être un cauchemar de maintenance et j'ai rencontré des directives qui ont été enfreintes par ces conditions (certes, les directives étaient loin d'être parfaites pour commencer ). (J'ai essayé de demander sur les forums cPanel, mais je n'ai jamais eu de bonne réponse.)
... existe-t-il un moyen de combiner les règles de réécriture pour que les conditions ne soient écrites qu'une seule fois?
Oui. Vous pouvez déplacer ces conditions vers leur propre bloc au début du .htaccessfichier et inverser leur signification, donc au lieu de ne déclencher que RewriteRulelorsqu'une requête ne correspond pas au modèle (en utilisant une expression régulière négative ). Vous pouvez empêcher d'autres réécritures lorsqu'une demande correspond au modèle. Par exemple:
# 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
 
     Notez la suppression du !préfixe (négation) sur le CondPattern et de l' ORindicateur supplémentaire sur les trois premières conditions. Le RewriteRulethen empêche le traitement d'autres directives mod_rewrite si la requête correspond.
(Sur Apache 2.4.8+, ces directives peuvent être entièrement déplacées vers la configuration du serveur. Avec l'aide de RewriteOptions InheritDownBefore.)
Ensuite, suivi des RewriteRuledirectives que vous aviez auparavant (bien que j'aie ajouté le Ldrapeau):
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]
 
     Vous devriez probablement inclure des Lindicateurs sur ces réécritures restantes.
Vous pouvez également combiner ces 3 réécritures en une seule directive si vous le souhaitez, mais cela dépendra si votre application gère des paramètres d'URL vides.
(Quelqu'un m'a suggéré d'utiliser le drapeau QSA, cependant, après des recherches, je ne pense pas que cela ait quoi que ce soit à voir avec ce que je veux accomplir.)
Oui, cela n'a vraiment rien à voir avec ce problème particulier. L' QSAindicateur (Query String Append) vous permet de fusionner toute chaîne de requête qui était présente sur la demande avec la chaîne de requête que vous écrivez dans la RewriteRule substitution .