¿Redirigir URL dentro de Apache VirtualHost?

61

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

Mi archivo VH .conf para 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 manera simple de redirigir el www a la versión no www? Actualmente estoy enviando ambas versiones a la misma DocumentRooty usando .htaccesspero estoy seguro de que debo poder hacerlo en el archivo VirtualHost.

Cabra descontento
fuente

Respuestas:

105

Resulta que las mod_rewritereglas están bien en el archivo VirtualHosts, aparte de la RewriteBaseregla. 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>

EDITAR: siguiendo los consejos de joschi en los comentarios, ahora estoy usando esta versión simplificada usando la Redirectdirectiva de mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
Cabra descontento
fuente
2
No necesita mod_rewrite para esto. Utilice mod_alias y su directiva RedirectPermanent en su lugar.
joschi
@joschi: ¿Cuál sería la ventaja de eso? ¿Es más rápido?
DisgruntledGoat
12
No necesita el motor de reescritura completo con todas sus comprobaciones y posibilidades para simplemente redirigir al cliente. Sería (marginalmente) más rápido ya que mod_alias no es tan complejo como mod_rewrite y solo necesitaría una directiva (RedirectPermanent) en lugar de dos con mod_rewrite. Y por último, pero no menos importante, en mi humilde opinión, es más fácil entender lo que sucede en la configuración cuando alguien lo mira por primera vez.
joschi
1
Por alguna extraña razón, Redirect 301 .. no funcionó para nosotros. Tuvimos que usar la opción RewriteRule.
so_mv
NOTA: ¡Usar PHP 5.3.0 en WAMPSERVER 2.0 en Windows Server 2008 R2 Enterprise, sin incluir :80después, VirtualHost *hace que todo regrese "Prohibido"!
Cees Timmerman
4

Tenga mucho cuidado con los redireccionamientos 301 porque, de forma predeterminada, un navegador que recibe el redireccionamiento 301 lo almacenará permanentemente, lo que significa que cederá el control de lo que verá ese navegador cuando intente acceder al dominio www.example.com.

Ver, por ejemplo, esta discusión http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Por lo tanto, asegúrese de que no se almacena en caché o use mod_proxy (recomiendo mod_proxy).

Si está de acuerdo con dejar que el usuario vea el cambio de URL en la barra de direcciones del navegador, use 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 desea que la "redirección" sea invisible para el usuario, use 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>

Cabe señalar que mod_proxy, cuando está mal configurado, puede dañar su red.

Marco Trevisan
fuente
55
El punto de un 301 es que es una redirección permanente ; Si desea una redirección no permanente, debe utilizar 302 o 307 en su lugar.
nickgrim
2

Puede agregar ServerAlias example.comal VirtualHostpero el rendimiento será diferente de una redirección.

Editar

Como desea redirigir y no necesita una funcionalidad avanzada, parece que usarlo Redirectdebería ser suficiente para usted. Pondría el Redirectbajo una directiva VirtualHost.

Una solución del lado del cliente sería usar una meta refreshetiqueta.

Warner
fuente
¿Puedes explicar un poco más? ¿Cómo redirigiría www.example.coma example.comusar este método?
DisgruntledGoat
En su host principal, tiene entradas para ambos ServerNamey ServerAlias. Uno tiene example.com y el otro www.example.com. Luego, ambas entradas dns accederán a los documentos especificados en el mismo vhost.
Warner
Sin embargo, quiero hacer una redirección , no solo un alias.
DisgruntledGoat
Entonces la recomendación de joshchi puede ser un buen enfoque para usted. Parece que los pelos se están dividiendo en este punto.
Warner
1

bueno, podría crear un host virtual para SERVERNAME www.example.com y redirigirlo a otro host virtual con el nombre de servidor example.com

Devin Ceartas
fuente