Comment déboguer .htaccess RewriteRule ne fonctionne pas

115

J'ai RewriteRuleun .htaccessfichier dans un fichier qui ne fait rien. Comment résoudre ce problème?

  • Comment puis-je vérifier si le .htaccessfichier est même lu et respecté par Apache? Puis-je écrire un message d'écho "ça marche", si je l'écris, où cette ligne serait-elle renvoyée?
  • Si le .htaccessfichier n'est pas utilisé, comment puis-je faire en sorte qu'Apache l'utilise?
  • Si le .htaccessest utilisé mais que mon RewriteRulen'a toujours pas d'effet, que puis-je faire de plus pour déboguer?
macha
la source

Réponses:

144

Entrez une valeur indésirable dans votre, .htaccess par exemple foo bar, sakjnaskljdnas tout mot clé non reconnu par htaccess et visitez votre URL. Si cela fonctionne, vous devriez obtenir un

500 Erreur de serveur interne

Erreur Interne du Serveur

Le serveur a rencontré une erreur interne ou une mauvaise configuration et n'a pas pu terminer votre demande.

Je vous suggère de le mettre peu de temps après RewriteEngine on.


Puisque vous êtes sur votre machine. Je suppose que vous avez accès au .conffichier apache .

ouvrez le .conffichier et recherchez une ligne similaire à:

LoadModule rewrite_module modules/mod_rewrite.so

S'il est commenté (#), décommentez et redémarrez apache.


Pour enregistrer la réécriture

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Mettez les 3 lignes ci-dessus dans votre virtualhost. redémarrez le httpd.

RewriteLogLevel 9L'utilisation d'une valeur élevée pour Level ralentira considérablement votre serveur Apache! Utilisez le fichier journal de réécriture à un niveau supérieur à 2 uniquement pour le débogage! Le niveau 9 enregistrera presque tous les détails du réécriture.


METTRE À JOUR

Les choses ont changé dans Apache 2.4:

FROM Mise à niveau vers 2.4 à partir de 2.2

Les directives RewriteLog et RewriteLogLevel ont été supprimées. Cette fonctionnalité est désormais fournie en configurant le niveau de journalisation approprié pour le module mod_rewrite à l'aide de la directive LogLevel . Voir aussi la section de journalisation mod_rewrite.

Pour plus d'informations sur LogLevel, reportez-vous à la directive LogLevel

tu peux accomplir

RewriteLog "/path/to/rewrite.log"

de cette manière maintenant

LogLevel debug rewrite_module:debug
PenserMonkey
la source
Ok, donc le problème est que j'essaie d'ajouter une réécriture au fichier .htaccess, et pour une raison quelconque, il ne l'utilise pas.
macha
@macha essayez la méthode ci-dessus. Si vous obtenez une erreur de serveur interne, cela signifie que mod_rewrite (.htaccess) est activé. Êtes-vous sur un hôte partagé?
ThinkingMonkey
Non, je travaille sur mon hôte local, avez-vous une idée de quand le fichier .htaccess se charge-t-il? Je
macha
Les fichiers @macha .htaccess ne se chargent jamais. Ils sont accessibles (s'ils sont présents) par apache lorsque vous essayez d'accéder à une page présente dans ce dossier.
ThinkingMonkey
ok ma question était, si quelqu'un demande une page Web, Apache accède-t-il directement aux scripts côté serveur ou cherchera-t-il le fichier .htaccess dans ce dossier, puis continue?
macha
52

La réponse «Entrez une valeur indésirable» n'a pas fait l'affaire pour moi, mon site continuait à se charger malgré le courrier indésirable entré.

Au lieu de cela, j'ai ajouté la ligne suivante en haut du fichier .htaccess:

deny from all

Cela vous permettra de savoir rapidement si .htaccess est récupéré ou non. Si le .htaccess est utilisé, les fichiers de ce dossier ne se chargeront pas du tout.

caitriona
la source
4
C'est le test le plus simple si cela ne vous dérange pas que rien ne fonctionne pendant quelques secondes pendant que vous vérifiez.
Mordred
1
Oui, il m'a fallu environ une seconde pour vérifier que le site sur lequel je travaillais n'utilisait pas de fichiers .htaccess.
bonh
1
Merci, fonctionne comme un charme :) m'a sauvé du temps de débogage!
Martijn van Hoof
32

En général, toute modification du .htaccess doit avoir des effets visibles. Si aucun effet, vérifiez vos fichiers apache de configuration, quelque chose comme:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Devrait être remplacé par

AllowOverride All

Et vous pourrez modifier les directives dans les fichiers .htaccess.

jgpATs2w
la source
Merci. J'ai trouvé la section appropriée dans le fichier principal apache2.conf pour l'arborescence des répertoires / var / www
Tim Richardson
6

Une méthode plus logique serait peut-être de créer un fichier (par exemple, test.html), d'ajouter du contenu, puis d'essayer de le définir comme page d'index:

DirectoryIndex test.html

Pour la plupart, la règle .htaccess remplacera la configuration Apache où elle fonctionnait au niveau du répertoire / fichier

Cez
la source
4

Pour répondre à la première des trois questions posées, un moyen simple de voir si le fichier .htaccess fonctionne ou non est de déclencher une erreur personnalisée en haut du fichier .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Passant à votre deuxième question, si le fichier .htaccess n'est pas lu, il est possible que la configuration principale d'Apache du serveur soit AllowOverridedéfinie sur None. La documentation d'Apache contient des conseils de dépannage pour cela et d'autres cas qui peuvent empêcher le .htaccess de prendre effet.

Enfin, pour répondre à votre troisième question, si vous avez besoin de déboguer des variables spécifiques que vous référencez dans votre règle de réécriture ou si vous utilisez une expression que vous souhaitez évaluer indépendamment de la règle, vous pouvez effectuer les opérations suivantes:

Sortez la variable que vous référencez pour vous assurer qu'elle a la valeur que vous attendez:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Testez l' expression de manière indépendante en la plaçant dans une <If>directive. Cela vous permet de vous assurer que votre expression est écrite correctement ou qu'elle correspond lorsque vous vous attendez à ce qu'elle:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Bon débogage .htaccess!

PeterA
la source
3

Si vous avez accès au répertoire apache bin que vous pouvez utiliser,

httpd -M pour vérifier d'abord les modules chargés.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Après cela, des directives simples comme Options -Indexesou deny from allsolidifieront que .htaccess fonctionne correctement.

Abhishek Gurjar
la source
1

Pour tester vos règles de réécriture htaccess, remplissez simplement l'url à laquelle vous appliquez les règles, placez le contenu de votre htaccess sur la plus grande zone de saisie et appuyez sur le bouton «Test».

http://htaccess.mwl.be/

Ganesh Kandu
la source
-1

Pourquoi ne pas mettre des fichiers indésirables dans votre fichier .htaccess et essayer de recharger apache. Si Apache ne démarre pas, vous savez qu'il fonctionne. Supprimez le courrier indésirable, puis rechargez Apache s'il charge les félicitations que vous avez configuré correctement .htaccess.

Ben Rabidou
la source
7
Je ne pense pas qu'Apache échouera au démarrage ou à l'exécution s'il y a un mauvais .htaccess, étant donné qu'il ne vérifie pas .htaccess tant qu'il n'y a pas de demande de page.
Andrew