Rediriger l'URL dans Apache VirtualHost?

61

J'ai un serveur dédié avec Apache, sur lequel j'ai configuré des hôtes virtuels. J'en ai configuré un pour gérer le domaine www ainsi que le domaine non-www.

Mon fichier .conf VH pour le www:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

Avec ceci .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 à la même chose DocumentRoot, .htaccessmais je suis sûr que je dois pouvoir le faire dans le fichier VirtualHost.

Chèvre mécontente
la source

Réponses:

105

Il s'avère que les mod_rewriterègles sont correctes dans le fichier VirtualHosts, à l'exception de la RewriteBaserègle. J'ai fini 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 Redirectdirective de mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
Chèvre mécontente
la source
2
Vous n'avez pas besoin de mod_rewrite pour cela. Utilisez mod_alias et sa directive RedirectPermanent à la place.
joschi
@ joschi: Quel serait l'avantage de cela? Est-ce plus rapide?
DisgruntledGoat
12
Vous n'avez pas besoin du moteur de réécriture complet avec toutes ses vérifications et possibilités pour simplement rediriger le client. Ce serait (légèrement) plus rapide, car mod_alias n'est pas aussi complexe que mod_rewrite et vous n'avez besoin que d'une directive (RedirectPermanent) au lieu de deux avec mod_rewrite. Enfin, à mon humble avis, il est plus facile de comprendre ce qui se passe dans la configuration lorsque quelqu'un la regarde pour la première fois.
joschi
1
Pour une raison étrange, Redirect 301 .. n'a pas fonctionné pour nous. Nous avons dû utiliser l'option RewriteRule.
so_mv
REMARQUE: L'utilisation de PHP 5.3.0 sur WAMPSERVER 2.0 sur Windows Server 2008 R2 Enterprise, sans inclure :80après, VirtualHost *fait que tout est renvoyé "Interdit"!
Cees Timmerman
4

Soyez très prudent avec les redirections 301 car, par défaut, un navigateur qui reçoit la redirection 301 le stockera de manière permanente, ce qui signifie que vous abandonnerez le contrôle de ce qu'il verra lorsqu'il tentera 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, soit assurez-vous qu'il ne soit pas mis en cache, soit utilisez mod_proxy (je recommande le mod_proxy).

Si vous pouvez laisser l'utilisateur voir le changement d'adresse 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.

Marco Trevisan
la source
5
Le point essentiel d’un 301 est qu’il s’agit d’une redirection permanente ; si vous souhaitez une redirection non permanente, vous devez utiliser 302 ou 307 à la place.
Nickgrim
2

Vous pouvez ajouter ServerAlias example.comà cela, VirtualHostmais la performance sera différente d'une redirection.

Modifier

Puisque vous voulez rediriger vos tâches et que vous n’avez pas besoin de fonctionnalités avancées, il semble que l’utilisation Redirectdevrait vous suffire. Vous mettriez le Redirectsous une directive VirtualHost.

Une solution côté client consisterait à utiliser une meta refreshbalise.

Warner
la source
Pouvez-vous expliquer un peu plus loin? Comment pourrais-je rediriger www.example.comà l' example.comaide de cette méthode?
DisgruntledGoat
Dans votre vhost principal, vous avez des entrées pour ServerNameet ServerAlias. L'un a example.com et l'autre www.example.com. Ensuite, les deux entrées DNS accéderont aux documents spécifiés dans le même vhost.
Warner
Je veux faire une redirection cependant, pas seulement un alias.
DisgruntledGoat
Alors la recommandation de Joshchi peut être une bonne approche pour vous. On dirait que les cheveux sont coupés en ce moment.
Warner
1

Eh bien, 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 exemple.com.

Devin Ceartas
la source