J'ai un serveur dédié avec Apache, sur lequel j'ai configuré quelques VirtualHosts. J'en ai configuré un pour gérer le domaine www ainsi que le domaine non www.
Mon fichier VH .conf pour le www:
<VirtualHost *>
DocumentRoot /var/www/site
ServerName www.example.com
<Directory "/var/www/site">
allow from all
</Directory>
</VirtualHost>
Avec ça .htaccess
:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_Host} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Existe-t-il un moyen simple de rediriger le www vers la version non www? Actuellement, j'envoie les deux versions au même DocumentRoot
et j'utilise .htaccess
mais je suis sûr que je dois pouvoir le faire dans le fichier VirtualHost.
Il s'avère que les règles mod_rewrite
Sont correctes dans le fichier VirtualHosts, à l'exception de la règle RewriteBase
. Je me suis retrouvé avec ceci:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_Host} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>
EDIT: sur les conseils de joschi dans les commentaires, j'utilise maintenant cette version simplifiée en utilisant la directive Redirect
de mod_alias
:
<VirtualHost *>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>
Soyez très prudent avec les redirections 301 car, par défaut, un navigateur qui reçoit la redirection 301 la stockera en permanence - ce qui signifie que vous abandonnerez le contrôle de ce que ce navigateur verra lorsqu'il essaiera d'accéder au domaine www.example.com
.
Voir par exemple cette discussion http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
Donc, assurez-vous qu'il ne soit pas mis en cache ou utilisez mod_proxy (je recommande le mod_proxy).
Si vous êtes d'accord pour laisser l'utilisateur voir le changement d'URL dans la barre d'adresse du navigateur, utilisez mod_rewrite:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_Host} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>
Si vous voulez que la "redirection" soit invisible pour l'utilisateur, utilisez mod_proxy:
<VirtualHost *>
ServerName www.example.com
ProxyRequests Off
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 203.0.113.67
</Proxy>
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
</VirtualHost>
Il convient de noter que mod_proxy, lorsqu'il est mal configuré, peut endommager votre réseau.
Vous pouvez ajouter ServerAlias example.com
vers VirtualHost
mais les performances seront différentes d'une redirection.
Modifier
Comme vous voulez rediriger et que vous n'avez pas besoin de fonctionnalités avancées, il semble que l'utilisation de Redirect
devrait vous suffire. Vous mettriez le Redirect
sous une directive VirtualHost.
Une solution côté client serait d'utiliser un meta refresh
tag.
vous pouvez créer un hôte virtuel pour SERVERNAME www.example.com et le rediriger vers un autre hôte virtuel avec le nom de serveur example.com