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?
# 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
!
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").