J'utilise le code suivant pour diriger toutes les demandes www vers des URL non www:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Cela fonctionne très bien à l'intérieur d'un fichier .htaccess à la racine de mon site Web.
Par exemple,
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> example.com/other_page
Cependant, si je déplace ce même code dans ma configuration VirtualHost, les URL réécrites contiennent une double barre oblique.
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.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?
la source
RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]
a fait l'affaire.Cela se produit parce que vous capturez une barre oblique initiale avec
(.*)
puis appliquez une autre barre oblique avant dans le nouvel emplacement/$1
. Cela ne s'était pas produit auparavant car mod_rewrite se comporte légèrement différemment lorsqu'il fonctionne dans un contexte par répertoire par opposition à un contexte par serveur.Vous pouvez éviter cela en anticipant éventuellement la barre oblique. De plus, vous pouvez utiliser RedirectMatch dans un VirtualHost vide avec vos domaines excédentaires, ce qui crée un peu moins de traitement et peut sembler plus propre.
la source
J'inclus ce post pour être complet.
La documentation Apache explique pourquoi ce problème se produit très bien et est la raison pour laquelle la directive «RewriteBase» existe.
Le simple fait d'inclure la directive «RewriteBase» dans votre fichier .htaccess devrait atteindre le résultat souhaité.
Exemple:
Dans la documentation Apache 2.2 mod_rewrite:
Ma règle d'or est d'utiliser presque toujours «RewriteBase» dans les fichiers .htaccess, et de ne pas l'utiliser dans la configuration Apache.
la source
Je n'ai pas eu le temps de gérer ce problème, il suffit donc de réécrire // dans / :)
la source