web-dev-qa-db-fra.com

RewriteCond pour ne pas réécrire un URI spécifique ne fonctionnant pas

Je travaille avec un raccourcisseur d'URL (YOURLS) et j'essaie d'avoir une certaine page non dirigée vers le script de traitement de lien. Voici l'original .htaccess:

# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$
RewriteRule ^.*$ /yourls-loader.php [L]
</IfModule>
# END YOURLS
RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

J'ai ajouté une nouvelle condition juste avant la ligne RewriteRule (commentée et indiquée ci-dessus):

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

avoir http://example.com/InvalidLink.html ignoré. Mais cela ne fait aucune différence. Qu'est-ce que je fais mal ici?

2
lfk
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

La condition que vous ajoutez n'est pas "fausse", à condition que l'URL demandée soit exactement /InvalidLink.html (correspondance sensible à la casse), ce fichier .htaccess se trouve dans la racine du document et le cache du navigateur a été effacé. avant de tester. Donc, cela reste un casse-tête. Essayez d’ajouter le drapeau NC - au cas où il y aurait une incompatibilité, par exemple:

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$ [NC]

Le fait que l'exception "fonctionne" si vous créez d'abord ce fichier, auquel cas la première condition (!-f) empêche la réécriture de se produire , suggère que le fichier est en cours de traitement et que votre cache est vide. Et que la condition ci-dessus est en cause. Cependant, d'après ce que vous avez posté, ça a l'air d'aller!?

Une alternative à l'ajout d'une condition à votre règle existante consiste à créer une "exception" distincte en haut de votre fichier. Ainsi, au lieu de dire "réécrivez l'URL si la demande ne concerne pas /InvalidLink.html", nous pouvons ajouter une règle distincte qui indique "si l'URL est /InvalidLink.html, alors arrêtez-vous ici et ne faites rien de plus".

Donc, au lieu de votre condition, incluez une règle distincte en haut de votre fichier:

RewriteRule ^InvalidLink\.html$ - [NC,L]

Notez qu'il n'y a pas de préfixe de barre oblique sur le modèle RewriteRule dans les fichiers par répertoire .htaccess. Cela correspond à /InvalidLink.html et empêche le traitement des directives mod_rewrite suivantes. Idéalement, le drapeau NC ne devrait pas être nécessaire, cependant, je l'ai inclus "au cas où".


Ceci est vraiment subsidiaire à votre problème principal ci-dessus ...

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

Ce carbuncle est ce que cPanel ajoute automatiquement avant chaque RewriteRule lors de l’implémentation du certificat SSL "Let's Encrypt". C'est très compliqué et il y a beaucoup d'arguments dans les forums de cPanel demandant que cela soit supprimé ou modifié. (Pourquoi ils ne peuvent pas ajouter un seul bloc de code/exception en haut du fichier est un mystère.)

Quoi qu'il en soit, dans l'intervalle, ces directives peuvent être supprimées en toute sécurité (dans tout le fichier) - elles ne sont pas obligatoires (après l'installation de la certification). Cela simplifiera vos directives en rendant le fichier plus lisible (et en évitant tout conflit potentiel). Cependant, cPanel ajoutera automatiquement ces directives ultérieurement lors du renouvellement des certificats (tous les 3 mois).

RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

Comme mentionné ci-dessus, les conditions intermédiaires peuvent être supprimées en toute sécurité. Cependant, cette redirection canonique est au mauvais endroit! Il doit être tout en haut de votre fichier, sinon aucune de vos URL abrégées ne sera canonisée. En bref, cPanel n’est pas très bon (peu fiable) pour éditer le fichier .htaccess!

Résumé

En rassemblant tout ce qui précède, votre fichier .htaccess existant peut être réécrit comme suit:

RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} ^www\.(.+) [NC]
RewriteRule (.*) http://%1/$1 [R=301,L]

# Exceptions - avoid these URLs being rewritten
RewriteRule ^InvalidLink\.html$ - [NC,L]

# BEGIN YOURLS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /yourls-loader.php [L]
# END YOURLS

Le wrapper <IfModule> n'est pas requis. Et la directive RewriteBase était superflue. .* est identique à ^.*$. Une barre oblique inverse dans la substitution RewriteRule n'est pas nécessaire (c'est "cPanel typique").

1
MrWhite