web-dev-qa-db-fra.com

Rediriger l'URL dans Apache VirtualHost?

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.

61
DisgruntledGoat

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>
108
DisgruntledGoat

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.

4
Marco Trevisan

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.

2
Warner

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

1
Devin Ceartas