De nombreuses affiches ont des problèmes pour déboguer leurs instructions RewriteRule et RewriteCond dans leurs .htaccess
fichiers. 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 .htaccess
fichiers 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 .htaccess
piè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
.htaccess
fichiers . 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 occurred
Ainsi, vos règles seront exécutées à plusieurs reprises et si vous modifiez le chemin URI, il peut finir par exécuter d'autres
.htaccess
fichiers s'ils existent. Assurez-vous donc de terminer cette boucle, si nécessaire en ajoutant desRewriteCond
règles supplémentaires pour arrêter le tir. Supprimez également tous les ensembles de règles de.htaccess
réé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
.htaccess
fichier 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.php
vous pouvez le copiertest/blog/index.php
et l'utiliser pour tester les règles de votre blog dans letest
sous - 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
.htaccess
contexte, (c'est là que celaRewriteRule
entraî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);
la source
Réponses:
Voici quelques conseils supplémentaires sur les règles de test qui peuvent faciliter le débogage pour les utilisateurs sur l'hébergement partagé
1. Utilisez un agent de faux utilisateurs
Lors du test d'une nouvelle règle, ajoutez une condition pour l'exécuter uniquement avec un
fake
agent utilisateur que vous utiliserez pour vos demandes. De cette façon, cela n'affectera personne d'autre sur votre site.par exemple
Si vous utilisez Firefox, vous pouvez utiliser le sélecteur d'agent utilisateur pour créer la fausse chaîne d'agent utilisateur et tester.
2. N'utilisez pas 301 avant d'avoir terminé les tests
J'ai vu tellement de messages où les gens testent encore leurs règles et utilisent des 301. PAS .
Si vous n'utilisez pas la suggestion 1 sur votre site, non seulement vous, mais toute personne visitant votre site à ce moment-là sera affectée par le 301.
N'oubliez pas qu'ils sont permanents et agressivement mis en cache par votre navigateur. Utilisez un 302 à la place jusqu'à ce que vous soyez sûr, puis changez-le en 301.
3. N'oubliez pas que les 301 sont agressivement mis en cache dans votre navigateur
Si votre règle ne fonctionne pas et qu'elle vous semble correcte et que vous n'utilisiez pas les suggestions 1 et 2, testez à nouveau après avoir effacé le cache de votre navigateur ou en navigation privée.
4. Utilisez un outil de capture HTTP
Utilisez un outil de capture HTTP comme Fiddler pour voir le trafic HTTP réel entre votre navigateur et le serveur.
Alors que d'autres pourraient dire que c'est le cas
site does not look right
, vous pouvez plutôt le voir et le signalerall of the images, css and js are returning 404 errors
, réduisant rapidement le problème.Alors que d'autres vous signaleront
started at URL A and ended at URL C
, vous pourrez voir qu'ils ont commencé àURL A, were 302 redirected to URL B and 301 redirected to URL C
. Même si l'URL C était l'objectif ultime, vous saurez que cela est mauvais pour le référencement et doit être corrigé.Vous pourrez voir les en-têtes de cache qui ont été définis côté serveur, relire les requêtes, modifier les en-têtes de requête à tester ....
la source
[L,R=302]
[L, R=302]
juste faire[L,R]
la valeur par défaut est302
Test de réécriture .htaccess en ligne
J'ai trouvé cette aide sur Google pour RegEx, cela m'a fait gagner beaucoup de temps de devoir télécharger de nouveaux
.htaccess
fichiers chaque fois que je fais une petite modification.du site:
la source
N'oubliez pas que dans les fichiers .htaccess, c'est une URL relative qui correspond.
Dans un fichier .htaccess, la RewriteRule suivante ne correspondra jamais:
la source
/
, mais cette suppression ne se produit pas pour les chaînes de correspondance assemblées dans les commandes de réécriture Cond .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 regexpCheck.php ci-dessous pour un script simple que vous pouvez ajouter à un répertoire privé / test de votre site pour vous y aider. J'ai gardé ce bref plutôt que joli. Il suffit de le coller dans un fichier
regexpCheck.php
dans un répertoire de test pour l'utiliser sur votre site Web. Cela vous aidera à créer une expression rationnelle et à la tester par rapport à une liste de cas de test au fur et à mesure. J'utilise le moteur PHP PCRE ici, mais après avoir jeté un œil à la source Apache, celle-ci est fondamentalement identique à celle utilisée dans Apache. Il existe de nombreux HowTos et tutoriels qui fournissent des modèles et peuvent vous aider à développer vos compétences d'expression rationnelle.Listing 1 - regexpCheck.php
la source
import_request_variables
été déconseillé en PHP 5.3 et supprimé en 5.4.extract($_GET)
couplé avecextract($_POST)
peut exécuter la même fonction, mais toutes les variables auraient besoin du préfixe supprimé de leur nom. Source: php.net/manual/en/function.import-request-variables.phpAssurez-vous d'utiliser le signe pourcentage devant les variables, pas le signe dollar.
Il est
%{HTTP_HOST}
, non${HTTP_HOST}
. Il n'y aura rien dans le error_log, il n'y aura pas d'erreurs internes au serveur, votre expression régulière est toujours correcte, la règle ne correspondra tout simplement pas. C'est vraiment hideux si vous travaillez beaucoup avec les modèles django / genshi et que vous avez${}
une substitution de variable dans la mémoire musculaire.la source
Un de quelques heures que j'ai perdu:
Si vous avez appliqué tous ces conseils et que vous ne faites que 500 erreurs parce que vous n'avez pas accès au journal des erreurs du serveur, le problème n'est peut-être pas dans le fichier .htaccess mais dans les fichiers vers lesquels il est redirigé.
Après avoir résolu mon problème .htaccess, j'ai passé deux heures de plus à le résoudre, même si j'avais simplement oublié certaines autorisations.
la source
.htaccess
problèmes difficiles .Définissez des variables d'environnement et utilisez des en-têtes pour les recevoir:
Vous pouvez créer de nouvelles variables d'environnement avec des lignes RewriteRule, comme mentionné par OP:
Mais si vous ne pouvez pas faire fonctionner un script côté serveur, comment pouvez-vous alors lire cette variable d'environnement? Une solution consiste à définir un en-tête:
La valeur accepte les spécificateurs de format , y compris le
%{NAME}e
spécificateur pour les variables d'environnement (n'oubliez pas le e minuscule). Parfois, vous devrez ajouter leREDIRECT_
préfixe, mais je n'ai pas déterminé quand le préfixe est ajouté et quand il ne le fait pas.la source
REDIRECT_
préfixe? De plus, je vois la terminologie sur les préfixes dans d'autres contextes (htaccess) également, mais il n'a jamais été clair exactement ce que l'on entend. Cela signifie-t-il que vous devez nommer votre variable avec le préfixe, ou ajouter le préfixe à votre variable nommée, lorsque vous utilisez certaines commandes (mais pas d'autres commandes)? Votre exemple est le premier qui montre à la fois la définition de la var et l'utilisation de la var, donc je suis enclin à penser à cette dernière! Les documents ont été peu utiles - ils supposent que nous en savons trop et donnent trop peu de références / liens.Si vous créez des redirections, testez avec curl pour éviter les problèmes de mise en cache du navigateur. Utilisez -I pour récupérer uniquement les en-têtes http. Utilisez -L pour suivre toutes les redirections.
la source
J'ai trouvé cette question en essayant de déboguer mes problèmes de mod_rewrite, et elle contient certainement des conseils utiles. Mais à la fin, la chose la plus importante est de vous assurer que votre syntaxe regex est correcte. En raison de problèmes avec ma propre syntaxe RE, l'installation du script regexpCheck.php n'était pas une option viable.
Mais comme Apache utilise des expressions régulières compatibles Perl (PCRE), tout outil qui aide à écrire des PCRE devrait aider. J'ai utilisé l'outil de RegexPlanet avec des RE Java et Javascript dans le passé, et j'ai été heureux de constater qu'ils prennent également en charge Perl.
Tapez simplement votre expression régulière et un ou plusieurs exemples d'URL, et il vous dira si la regex correspond (un "1" dans la colonne "~ =") et, le cas échéant, les groupes correspondants (les nombres dans le "split" La colonne correspondra aux nombres qu'Apache attend, par exemple 1 $, 2 $, etc.) pour chaque URL. Ils prétendent que le support PCRE est "en version bêta", mais c'était exactement ce dont j'avais besoin pour résoudre mes problèmes de syntaxe.
http://www.regexplanet.com/advanced/perl/index.html
J'aurais simplement ajouté un commentaire à une réponse existante mais ma réputation n'est pas encore à ce niveau. J'espère que cela aide quelqu'un.
la source
En ce qui concerne 4., vous devez toujours vous assurer que votre "talon de script factice" est bien l'URL cible une fois la réécriture terminée, sinon vous ne verrez rien!
Une astuce similaire / connexe (voir cette question ) consiste à insérer une règle temporaire telle que:
Où
show.php
est un script très simple qui affiche simplement ses$_GET
paramètres (vous pouvez également afficher des variables d'environnement, si vous le souhaitez).Cela arrêtera la réécriture au moment où vous l'insérez dans l'ensemble de règles, plutôt comme un point d'arrêt dans un débogueur.
Si vous utilisez Apache <2.3.9, vous devrez utiliser
[L]
plutôt que[END]
, et vous devrez alors peut- être ajouter:Tout en haut de votre ensemble de règles, si l'URL
/show.php
est elle-même en cours de réécriture.la source
Certaines erreurs que j'ai observées se produisent lors de l'écriture
.htaccess
L'utilisation
^(.*)$
répétitive de plusieurs règles, l'utilisation^(.*)$
entraîne l'impuissance d'autres règles dans la plupart des cas, car elle correspond à toutes les URL en un seul coup.Donc, si nous utilisons la règle pour cette URL,
sapmle/url
elle consommera également cette URLsapmle/url/string
.[L]
L'indicateur doit être utilisé pour garantir que notre règle a terminé le traitement.Devrait savoir:
Différence en% n et $ n
%n
est apparié pendant la%{RewriteCond}
partie et$n
correspond à la%{RewriteRule}
partie.Fonctionnement de RewriteBase
la source
Si vous prévoyez d'écrire plus d'une ligne de règles dans .htacesss,
ne pensez même pas à essayer l'une de ces méthodes de correction à chaud pour la déboguer.
J'ai perdu des jours à définir plusieurs règles, sans commentaires des journaux, pour finalement abandonner.
J'ai installé Apache sur mon PC, j'ai copié tout le site sur son disque dur et j'ai trié l'ensemble des règles, en utilisant les journaux, très rapidement.
Ensuite, j'ai revu mes anciennes règles, qui fonctionnaient. J'ai vu qu'ils ne faisaient pas vraiment ce qui était souhaité. Une bombe à retardement, étant donné une adresse légèrement différente.
Il y a tellement de pièges dans les règles de réécriture, ce n'est pas du tout logique.
Vous pouvez obtenir Apache opérationnel en dix minutes, il est de 10 Mo, bonne licence, prêt pour NIX / WIN / MAC, même sans installation.
Vérifiez également les lignes d'en-tête de votre serveur et obtenez la même version d'Apache à partir de leurs archives si elle est ancienne. Mon OP est toujours sur 2.0; beaucoup de choses ne sont pas prises en charge.
la source
mod_rewrite
règles de débogage , mais l'ouverture "n'y pensez même pas" est simplement un mauvais conseil pour les utilisateurs de services partagés de base qui ont du mal à comprendre pourquoi leurshtaccess
fichiers ne sont pas '' t travailler comme ils le pensent..htaccess
fichiers", alors c'est plus équilibré. Oui, il est relativement facile de configurer un service Apache local, mais le faire refléter le service d'hébergement partagé d'un fournisseur de services peut être compliqué, et au-delà du niveau de compétence de nombreux utilisateurs qui peuvent avoir simplement utilisé une configuration en un clic de Wordpress, dire, et ont des problèmes avec leur.htaccess
fichier.Je vais laisser cela ici, peut-être un détail évident, mais ça m'a fait me cogner la tête pendant des heures: soyez prudent en utilisant
%{REQUEST_URI}
parce que ce que @Krist van Besien dit dans sa réponse est tout à fait juste, mais pas pour la chaîne REQUEST_URI , parce que le résultat de cette TestString commence par un/
. Alors faites attention:la source
(Similaire à l'idée de Doin) Pour montrer ce qui est apparié, j'utilise ce code
Enregistrez-le dans r.php à la racine du serveur, puis faites des tests en .htaccess
Par exemple, je veux faire correspondre les URL qui ne commencent pas par un préfixe de langue
la source
QUERY_STRING
comme l'a souligné @JCastell, le testeur en ligne fait un bon travail de test des redirections individuelles par rapport à un fichier .htaccess. Cependant, plus intéressante est l' api exposée qui peut être utilisée pour tester par lots une liste d'urls à l'aide d'un objet json. Cependant, pour le rendre plus utile, j'ai écrit un petit fichier de script bash qui utilise curl et jq pour soumettre une liste d'URL et analyser la réponse json dans une sortie au format CSV avec le numéro de ligne et la règle correspondant dans le fichier htaccess avec l'URL redirigée, ce qui rend très pratique la comparaison d'une liste d'URL dans une feuille de calcul et la détermination rapide des règles qui ne fonctionnent pas.
la source
Si vous travaillez avec l'URL, vous voudrez peut-être vérifier si vous "Activez la réécriture du mod"
la source