De nombreuses affiches ont des problèmes pour déboguer leurs instructions RewriteRule et RewriteCond dans leurs .htaccessfichiers. La plupart d'entre eux utilisent un service d'hébergement partagé et n'ont donc pas accès à la configuration du serveur racine. Ils ne peuvent pas éviter d'utiliser des .htaccessfichiers pour la réécriture et ne peuvent pas activer un RewriteLogLevel "comme le suggèrent de nombreux répondants. De plus, il existe de nombreux .htaccesspièges et contraintes spécifiques qui ne sont pas bien couverts. La configuration d'une pile LAMP de test locale implique trop de courbe d'apprentissage pour la plupart .
Donc, mon Q ici est de savoir comment recommanderions-nous de déboguer leurs règles eux-mêmes . Je donne quelques suggestions ci-dessous. D'autres suggestions seraient appréciées.
Comprenez que le moteur mod_rewrite parcourt les
.htaccessfichiers . Le moteur exécute cette boucle:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurredAinsi, vos règles seront exécutées à plusieurs reprises et si vous modifiez le chemin URI, il peut finir par exécuter d'autres
.htaccessfichiers s'ils existent. Assurez-vous donc de terminer cette boucle, si nécessaire en ajoutant desRewriteCondrègles supplémentaires pour arrêter le tir. Supprimez également tous les ensembles de règles de.htaccessréécriture de niveau inférieur, sauf si vous avez l'intention explicite d'utiliser des ensembles de règles à plusieurs niveaux.Assurez-vous que la syntaxe de chaque expression rationnelle est correcte en testant par rapport à un ensemble de modèles de test pour vous assurer qu'il s'agit d'une syntaxe valide et fait ce que vous souhaitez avec une gamme complète d'URI de test. Voir la réponse ci-dessous pour plus de détails.
Créez vos règles de manière incrémentielle dans un répertoire de test. Vous pouvez utiliser la fonction «exécuter le
.htaccessfichier le plus profond sur le chemin» pour configurer un répertoire de test (arborescence) distinct et déboguer les ensembles de règles ici sans bousiller vos règles principales et arrêter le fonctionnement de votre site. Vous devez les ajouter un à la fois car c'est le seul moyen de localiser les échecs des règles individuelles.Utilisez un stub factice pour vider les variables de serveur et d'environnement . (Voir Listing 2 ) Si votre application utilise, disons,
blog/index.phpvous pouvez le copiertest/blog/index.phpet l'utiliser pour tester les règles de votre blog dans letestsous - répertoire. Vous pouvez également utiliser des variables d'environnement pour vous assurer que le moteur de réécriture interprète correctement les chaînes de substitution, par exempleRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]et recherchez ces variables REDIRECT_ * dans le vidage phpinfo. BTW, j'ai utilisé celui-ci et découvert sur mon site que je devais utiliser à la
%{ENV:DOCUMENT_ROOT_REAL}place. Dans le cas d'une boucle de redirection, les variables REDIRECT_REDIRECT_ * listent la passe précédente. Etc..Assurez-vous que votre navigateur ne mord pas en mettant en cache des redirections 301 incorrectes . Voir la réponse ci-dessous . Mes remerciements à Ulrich Palha pour cela.
Le moteur de réécriture semble sensible aux règles en cascade dans un
.htaccesscontexte, (c'est là que celaRewriteRuleentraîne une substitution et cela revient à d'autres règles), car j'ai trouvé des bogues avec des sous-demandes internes (1) et un traitement PATH_INFO incorrect qui peut souvent be empêche l'utilisation des drapeaux [NS], [L] et [PT].
Avez-vous d'autres commentaires ou suggestions?
Listing 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);