72 votes

Rediriger l'URL dans le VirtualHost d'Apache ?

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 cette .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 la version www vers la version non-www ? Pour l'instant, j'envoie les deux versions au même endroit. DocumentRoot et en utilisant .htaccess mais je suis sûr que je dois pouvoir le faire dans le fichier VirtualHost.

129voto

DisgruntledGoat Points 2539

Il s'avère que mod_rewrite Les règles sont correctes dans le fichier VirtualHosts, à l'exception de l'élément suivant RewriteBase règle. Je me suis retrouvé avec ça :

<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 fonction Redirect de la directive mod_alias :

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

5voto

Marco Trevisan Points 41

Soyez très prudent avec les redirections 301 car, par défaut, un navigateur qui reçoit une redirection 301 la stocke de manière permanente - ce qui signifie que vous renoncez à contrôler 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/

Il faut donc soit s'assurer qu'il n'est pas mis en cache, soit utiliser le mod_proxy (je recommande le mod_proxy).

Si vous pouvez 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 est à noter que le mod_proxy, lorsqu'il est mal configuré, peut nuire à votre réseau.

2voto

Warner Points 23292

Vous pouvez ajouter ServerAlias example.com à la VirtualHost mais les performances seront différentes d'une redirection.

Modifier

Puisque vous voulez rediriger et que vous n'avez pas besoin de fonctionnalités avancées, il semble que l'utilisation de l'option Redirect devrait vous suffire. Vous mettez le Redirect sous une directive VirtualHost.

Une solution côté client serait d'utiliser un meta refresh étiquette.

1voto

Devin Ceartas Points 1438

Vous pourriez créer un hôte virtuel pour le nom de serveur www.example.com et le faire rediriger vers un autre hôte virtuel avec le nom de serveur exemple.com.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X