Question Pourquoi ai-je une double barre oblique en fonction de l'emplacement de mon RewriteRule?


J'utilise le code suivant pour diriger toutes les demandes www vers des URL autres que www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

Cela fonctionne très bien dans un fichier .htaccess à la racine de mon site Web.
Par exemple,
www.example.com -> exemple.com/
www.example.com/ -> exemple.com/
www.example.com/other_page -> exemple.com/other_page

Toutefois, si je déplace ce même code dans ma configuration VirtualHost, les URL réécrites contiennent une double barre oblique.
www.example.com -> exemple.com//
www.example.com/ -> exemple.com//
www.example.com/other_page -> exemple.com//other_page

Je l'ai corrigé en supprimant la barre oblique de la règle de réécriture:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]

Mais je ne peux pas comprendre la raison de cela. Quelqu'un sait pourquoi?


8
2018-06-11 14:46


origine




Réponses:


Si je comprends bien, dans les fichiers .htaccess, la chaîne que mod_rewrite traite dans votre règle est relative au répertoire dans lequel se trouve le fichier .htaccess. Par conséquent, il n’aura pas de /.

Dans l'entrée VirtualHost, la chaîne qu'il traite est absolue pour la racine du serveur et inclut donc le /.

Cela crée des différences subtiles dans le fonctionnement de mod_rewrite.

Voici quelqu'un avec un problème similaire et une solution:

http://forum.modrewrite.com/viewtopic.php?p=56322&sid=77f72967f59200b5b5de174440234c3a

Cela devrait fonctionner dans les deux cas, en supposant que je me souvienne de m'être échappé correctement:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^\/?(.*?)$ http://example.com/$1 [R=301,L]

8
2018-06-11 15:10



Merci! Maintenant je comprends pourquoi, au moins. Cependant, est-ce mieux pour quelque raison que de simplement supprimer le / avant le $ 1 comme je le montre dans ma question initiale? - davekaro
Ni meilleur ni pire, c'est juste un bloc que vous pouvez permuter entre .htaccess de VirtualHost sans avoir à le modifier à chaque fois pour gérer les différences de contexte. Si votre chemin fonctionne pour vous, restez-y! :) - Neobyte
Oh, c'est vrai - votre méthode fonctionnera à la fois en .htaccess et VirtualHost. Cela le rend meilleur IMO :) - davekaro
J'ai eu exactement le même problème que @davekaro et j'ai essayé votre solution. La dernière ligne n'a pas fonctionné pour moi. RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L] a fait le tour. - Kenny Rasschaert


Cela se produit parce que vous capturez une barre oblique initiale avec (.*) puis en appliquant une autre barre oblique avant au nouvel emplacement /$1. Cela ne s'était jamais produit auparavant, car mod_rewrite se comporte légèrement différemment dans un contexte par répertoire par rapport à un contexte par serveur.

Vous pouvez éviter cela en préemptant éventuellement la barre oblique. De plus, vous pouvez utiliser RedirectMatch dans un VirtualHost vide avec vos domaines en surplus, ce qui crée un peu moins de traitement et peut paraître plus propre.

<VirtualHost *>
ServerName example.com
ServerAlias other.example.com
..
RedirectMatch permanent ^/?(.*) http://example.com/$1
</VirtualHost>


2
2018-06-11 15:03



Agréable. J'aime l'approche RedirectMatch. J'irai probablement avec ceci car c'est vraiment une redirection que je veux accomplir. - davekaro


J'inclus ce post pour l'exhaustivité.

le Documentation Apache explique pourquoi ce problème se produit très bien et est la raison pour laquelle la directive 'RewriteBase' existe.

L'inclusion de la directive 'RewriteBase' dans votre fichier .htaccess devrait permettre d'obtenir le résultat souhaité.

Exemple:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

Dans la documentation Apache 2.2 mod_rewrite:

La directive RewriteBase explicitement   définit l'URL de base pour chaque répertoire   réécrit.

Ma règle d'or est d'utiliser presque toujours 'RewriteBase' dans les fichiers .htaccess, et de ne pas l'utiliser dans la configuration d'Apache.


1
2018-06-11 22:41





Je n’ai pas eu le temps de gérer ce problème, alors réécrivez simplement // dans / :)

RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ http://domain.com [R=301,L]

0
2018-05-25 03:38