Question Rediriger l'URL dans Apache VirtualHost?


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 ç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 en utilisant .htaccess mais je suis sûr que je dois pouvoir le faire dans le fichier VirtualHost.


56
2018-03-08 20:56


origine


stackoverflow.com/questions/42500012/… - rajeev


Réponses:


Il s'avère que mod_rewrite les règles sont bien dans le fichier VirtualHosts, à part le RewriteBase rè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 le Redirect directive de mod_alias:

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

101
2018-03-08 21:34



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
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
Pour une raison étrange, Redirect 301 .. n'a pas fonctionné pour nous. Nous avons dû utiliser l'option RewriteRule. - so_mv
REMARQUE: Utilisation de PHP 5.3.0 sur WAMPSERVER 2.0 sous Windows Server 2008 R2 Enterprise, sans compter :80 après VirtualHost * causes tout retourner "Interdit"! - Cees Timmerman


Soyez très prudent avec les redirections 301 car, par défaut, un navigateur qui reçoit la redirection 301 le stockera en permanence, ce qui signifie que vous laisserez le contrôle sur 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, 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.


3
2018-01-18 11:29



Le point d'un 301 est que c'est un permanent réorienter; Si vous souhaitez une redirection non permanente, vous devez utiliser 302 ou 307 à la place. - nickgrim


Vous pouvez ajouter ServerAlias example.com au VirtualHost mais la performance sera différente d'une redirection.

modifier

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

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


2
2018-03-08 21:00



Pouvez-vous expliquer un peu plus loin? Comment pourrais-je rediriger www.example.com à example.com en utilisant cette méthode? - DisgruntledGoat
Dans votre vhost principal, vous avez des entrées pour les deux ServerName et 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 un réorienter 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


Eh bien, vous pouvez créer un hôte virtuel pour le SERVERNAME www.example.com et le rediriger vers un autre hôte virtuel avec le nom de serveur exemple.com.


1
2018-03-08 21:18