Pregunta ¿Redireccionar URL dentro de Apache VirtualHost?


Tengo un servidor dedicado con Apache, en el que he configurado 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 este .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 el www a la versión no www? Actualmente estoy enviando ambas versiones al mismo. DocumentRoot y usando .htaccess pero estoy seguro de que debo poder hacerlo en el archivo VirtualHost.


56
2018-03-08 20:56


origen


stackoverflow.com/questions/42500012/… - rajeev


Respuestas:


Resulta mod_rewrite las reglas están bien en el archivo de 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>

EDITAR: por consejo de joschi en los comentarios, ahora estoy usando esta versión simplificada usando el Redirect directiva de mod_alias:

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

101
2018-03-08 21:34



No necesitas 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
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 la mira por primera vez. - joschi
Por alguna extraña razón, Redirect 301 ... no funcionó para nosotros. Tuvimos que usar la opción RewriteRule. - so_mv
NOTA: Uso de PHP 5.3.0 en WAMPSERVER 2.0 en Windows Server 2008 R2 Enterprise, sin incluir :80 después VirtualHost * causas todo para devolver "Forbidden"! - Cees Timmerman


Tenga mucho cuidado con los redireccionamientos 301 porque, de manera predeterminada, un navegador que recibe el redireccionamiento 301 lo almacenará permanentemente, lo que significa que dejará de controlar lo que ese navegador verá 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/

Entonces, o asegúrate de que no se almacene en caché, o usa mod_proxy (recomiendo el 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 el "redireccionamiento" 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.


3
2018-01-18 11:29



El punto de un 301 es que es un permanente redirigir Si desea una redirección no permanente, debe utilizar 302 o 307 en su lugar. - nickgrim


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

Editar

Ya que quiere redirigir y no necesita una funcionalidad avanzada, parece que está usando 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.


2
2018-03-08 21:00



¿Puedes explicar un poco más? ¿Cómo redirigiría www.example.com a example.com utilizando este método? - DisgruntledGoat
En su vhost principal, tiene entradas para ambos ServerName y 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
Quiero hacer un redirigir aunque, no es solo un alias. - DisgruntledGoat
Entonces la recomendación de joshchi puede ser un buen enfoque para ti. Parece que los pelos se están dividiendo en este punto. - Warner


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


1
2018-03-08 21:18