Comment déboguer Apache mod_rewrite

171

J'ai deux problèmes principaux avec mod_rewrite:

1) Aucune erreur significative n'est signalée lorsque j'ai une règle invalide

entrez la description de l'image ici

2) Pour tester de manière fiable chaque modification, je dois effacer le cache de chrome. Ce n'est pas sorcier, mais je dois appuyer sur Ctrl + Maj + Suppr puis cliquer sur OK, puis fermer la fenêtre et recharger.

J'aimerais voir si l'un des gourous est prêt à partager ses secrets pour gérer efficacement le code mod_rewrite.

vomir
la source
1
Puk, voir stackoverflow.com/questions/9153262/… où je discute de certaines des astuces stanbdard.
TerryE
duplication possible de Comment déboguer le script de réécriture htaccess
utilisateur

Réponses:

283

Une astuce consiste à activer le journal de réécriture. Pour l'activer, essayez ces lignes dans votre configuration principale apache ou dans le fichier d'hôte virtuel actuel ( pas dans .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Depuis Apache httpd 2.4 mod_rewrite , les directives RewriteLog et RewriteLogLevel ont été complètement remplacées par la nouvelle configuration de journalisation par module.

LogLevel alert rewrite:trace6
Ben
la source
81
Vous ne pouvez pas mettre cela dans .htaccess. Vous devez le mettre dans la configuration VirtualHost.
Attila Szeremi
7
Vous devez avoir la RewriteEngine Onsection là aussi parce que si vous ne l'activez (comme je l'ai fait) que dans le .htaccessfichier, alors rien ne sera enregistré.
chacham15
12
où se trouve le fichier journal dans apache 2.4?
Charles John Thompson III
4
Vous trouverez les éléments du journal 2.4 dans le journal des erreurs correspondant. Cela peut dépendre de votre configuration, mais les configurations par défaut Debian / Ubuntu les ont dans /var/log/apache2/error.log
Josiah
10
Conseil de pro: n'oubliez pas de désactiver la déconnexion de réécriture. Si vous oubliez, vous remplissez votre disque dur assez rapidement, en particulier sur un serveur de production.
John Hunt
132

La directive LogRewrite mentionnée par Ben n'est plus disponible dans Apache 2.4. Vous devez utiliser la directive LogLevel à la place. Par exemple

LogLevel alert rewrite:trace6

Voir http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

Tobias Schultze
la source
22
où est le fichier journal associé à cela?
Charles John Thompson III
8
@CharlesJohnThompsonIII - Le fichier journal est le journal des erreurs (spécifié par la directive ErrorLog). Par docs, vous pouvez obtenir uniquement les messages de réécriture avec grep:tail -f error_log|fgrep '[rewrite:'
billynoah
1
n'oubliez pas de redémarrer apache
Accountant م
1
Je devais m'assurer que AllowOverridec'était réglé All!
Michael
25

Pour la résolution d'URL de base, utilisez un extracteur de ligne de commande comme wgetou curlpour effectuer les tests, plutôt qu'un navigateur manuel. Ensuite, vous n'avez à vider aucun cache; juste la flèche vers le haut et entrez dans un shell pour réexécuter vos extractions de test.

Kaz
la source
14
Une autre astuce consiste à utiliser le "mode porno" de Chrome (Ctl + Shift + N). Lorsque vous fermez la fenêtre, tout contexte de session mis en cache est mis dans la corbeille.
TerryE
Je pense que la navigation "session privée" de Firefox aussi. Mais dites-vous que ce contexte est par fenêtre individuelle (vous ne fermez donc pas Chrome?)
Kaz
2
AFAIK, Chrome et Ff sont différents en ce que Ff fonctionne comme un processus unique qui est en mode privé ou non. Avec Chrome, chaque onglet ou fenêtre s'exécute comme un processus distinct et peut être individuellement en mode privé; fermez une fenêtre / un onglet privé et son contexte est mis dans la corbeille.
TerryE
1
L'addon PrivateTab pour FF fait l'affaire. Chaque onglet fonctionne individuellement.
Javid
Cette méthode montre également les redirections! Bien pour quelqu'un qui n'a pas accès au fichier de configuration apache de la machine.
Geof Sawaya
14

Il y a le testeur htaccess .

Il montre quelles conditions ont été testées pour une certaine URL, lesquelles répondaient aux critères et quelles règles ont été exécutées.

Il semble cependant y avoir des problèmes.

Andy
la source
2
Pour moi, il a montré une règle exécutée verte dans la dernière ligne sans aucun code.
Andy
@thombr pouvez-vous être plus précis, s'il vous plaît? Le lien ne fonctionne pas? Ou l'outil? Qu'est-ce qui ne fonctionne pas exactement? Et pourquoi est-ce pertinent dans le contexte de cette question?
Andy
1
Cela me dit que l'URL est en train d'être transformée comme prévu ... mais sur le serveur réel, j'obtiens un 404
Michael
@michael est-ce que la règle testée est la seule présente dans votre configuration? Mod_rewrite est-il réellement installé et actif?
Andy
Il s'avère que les remplacements n'étaient pas activés
Michael
3

En vous basant sur la réponse de Ben, vous pouvez faire ce qui suit lorsque vous exécutez apache sur Linux (Debian dans mon cas).

Créez d'abord le fichier rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Puis entrez

$ a2enmod rewrite-log

suivi par

$ service apache2 redémarrer

Et lorsque vous avez terminé le débogage de vos règles de réécriture

$ a2dismod rewrite-log && service apache2 redémarrage

Couler
la source
Cela n'a pas fonctionné. J'obtiens sandino @ envy: ~ $ sudo service apache2 restart * Redémarrage du serveur Web apache2 [échec] * Le test de configuration apache2 a échoué. La sortie du test de configuration était: AH00526: Erreur de syntaxe sur la ligne 1 de /etc/apache2/mods-enabled/rewrite-log.load: Commande invalide 'RewriteLog', peut-être mal orthographiée ou définie par un module non inclus dans la configuration du serveur
sandino
3
@sandino, quelle version d'Apache utilisez-vous? Il semble que cette syntaxe a été modifiée pour la version 2.4, utilisez à la place: LogLevel warn rewrite:trace8ou LogLevel info rewrite:trace8où 8 peut être n'importe quel nombre de 1 à 8
insaner