65 votos

¿Redirigir la URL dentro de Apache VirtualHost?

Tengo un servidor dedicado con Apache, en el que he instalado algunos VirtualHosts. He configurado uno para manejar el dominio www así como el dominio no www.

Mi archivo VH .conf para el www:

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

Con esto .htaccess :

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

¿Hay una forma sencilla de redirigir la www a la versión no www? Actualmente estoy enviando ambas versiones a la misma DocumentRoot y usando .htaccess pero estoy seguro de que debo ser capaz de hacerlo en el archivo VirtualHost.

116voto

user17166 Puntos 11

Resulta que mod_rewrite reglas están bien en el archivo VirtualHosts, aparte de la RewriteBase regla. Terminé con esto:

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

EDIT: por consejo de joschi en los comentarios, ahora estoy usando esta versión simplificada:

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

4voto

Marco Trevisan Puntos 31

Tenga mucho cuidado con las redirecciones 301 porque, por defecto, un navegador que reciba la redirección 301 la almacenará de forma permanente, lo que significa que renunciará a controlar lo que verá ese navegador cuando intente acceder al dominio www.example.com .

Véase, por ejemplo, este debate http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Así que asegúrate de que no se almacena en la caché, o utiliza mod_proxy (recomiendo el mod_proxy).

Si le parece bien que el usuario vea el cambio de URL en la barra de direcciones del navegador, utilice 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 quieres que la "redirección" sea invisible para el usuario, utiliza 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>

Hay que tener en cuenta que mod_proxy, cuando está mal configurado, puede dañar su red.

2voto

Warner Puntos 17528

Puede añadir ServerAlias example.com a la VirtualHost pero el rendimiento será diferente al de una redirección.

Editar

Dado que quieres redirigir y no necesitas una funcionalidad avanzada, parece que usar Redirect debería ser suficiente para ti. Pondrías el Redirect bajo una directiva VirtualHost.

Una solución del lado del cliente sería utilizar un meta refresh etiqueta.

1voto

Devin Ceartas Puntos 1268

Bueno, usted podría crear un host virtual para el SERVERNAME www.example.com y hacer que se redirija a otro host virtual con el servername example.com

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: