web-dev-qa-db-fra.com

Trop de redirections dues au code htaccess

TL; DR: Que fait la ligne de code suivante? Supprime-t-il les barres obliques de fin d'une URL?

    RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

J'ai hérité d'un site Drupal avec peu de connaissances sur le fonctionnement des fichiers htaccess.

Nous avons un dossier, appelons-le "culture" dans notre racine de document. Dans le dossier Culture, nous avons un fichier index.html. C'est donc docroot/culture/index.html.

Dans mon navigateur, lorsque j'essaie d'accéder à www.nom_site.com/culture, je reçois une redirection infinie. Après avoir utilisé un vérificateur de redirection en ligne, j'ai constaté ce qui suit:

http://www.mysitename.com/culture/ 301 déplacé de façon permanente http://www.mysitename.com/culture 301 déplacé de façon permanente ...

La barre oblique finale (le vrai monstre ici) est ajoutée et supprimée 19 fois en avant et voici ce que dit l'erreur:

Trop de redirections. S'il vous plaît essayez de réduire votre nombre de redirections. En fait, vous utilisez 19 redirections. Idéalement, vous ne devriez pas utiliser plus de 3 redirections dans une chaîne de redirection. Plus de 3 redirections entraîneront une charge inutile sur votre serveur et réduiront la vitesse, ce qui entraînera une mauvaise expérience utilisateur.

Hélas, je pense avoir trouvé le problème dans cette ligne de code:

RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

Je commente cette ligne de code et la redirection ne se produit plus. Cependant, dans les commentaires relatifs à htaccess, il est indiqué que cette ligne que j'ai commentée est utilisée pour supprimer les barres obliques de fin sur nos pages - bien que les barres obliques de fin soient toujours supprimées sans elle.

Des idées sur ce que cette ligne de code fait?

4
SuperTony

RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

Oui, cette ligne supprime une barre oblique de fin de l'URL. Cependant, vous auriez besoin d'une condition avant d'empêcher une boucle de réécriture si mod_dir (DirectorySlash) est actif et que vous l'êtes. demander un répertoire de système de fichiers.

Et c'est probablement le problème ici. Si vous demandez /directory, où "répertoire" est un répertoire réel sur le système de fichiers, alors mod_dir (en particulier la directive DirectorySlash) ajoutera automatiquement la barre oblique finale afin de "corriger" le URL.

Donc, vous demandez /directory/, votre RewriteRule supprime la barre oblique finale et mod_dir le rajoute, etc.

Cependant, si vous accédez littéralement à index.html (le DirectoryIndex) sur le système de fichiers de ce répertoire et que vous n'avez aucun autre routage en cours, alors vous avez besoin de la barre oblique de fin sur l'URL. Il serait donc utile d’empêcher que les répertoires soient débarrassés de leurs barres obliques, par exemple:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

Si cela fonctionne sans, alors je suppose qu'il y a une autre réécriture en cours ou Drupal achemine la demande.

bien que les dernières barres obliques soient encore supprimées sans cela.

Peut-être que ce n'est pas nécessaire après tout !? Il est difficile de dire avec certitude sans voir le reste de votre fichier .htaccess.

Assurez-vous également que vous ne voyez pas de réponse en cache. 301 Les redirections (permanentes) sont naturellement mises en cache par le navigateur.

3
MrWhite