URL de redirecionamento dentro do Apache VirtualHost?

56

Eu tenho um servidor dedicado com o Apache, no qual eu configurei alguns VirtualHosts. Eu configurei um para lidar com o domínio www, bem como com o domínio não www.

Meu arquivo VH .conf para o www:

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

Com esse .htaccess :

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

Existe uma maneira simples de redirecionar o www para a versão não-www? Atualmente estou enviando ambas as versões para o mesmo DocumentRoot e usando .htaccess , mas tenho certeza que devo fazer isso no arquivo VirtualHost.

    
por DisgruntledGoat 08.03.2010 / 21:56

4 respostas

101

Acontece que as regras mod_rewrite estão bem no arquivo VirtualHosts, além da regra RewriteBase . Eu acabei com isso:

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

EDIT: seguindo o conselho do joschi nos comentários, estou usando agora esta versão simplificada usando o Redirect diretiva de mod_alias :

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
    
por 08.03.2010 / 22:34
3

Tenha muito cuidado com os redirecionamentos 301 porque, por padrão, um navegador que recebe o redirecionamento 301 irá armazená-lo permanentemente - ou seja, você desistirá do controle que esse navegador verá quando tentar acessar o domínio www.example.com .

Veja por exemplo esta discussão link

Então, certifique-se de que ele não seja armazenado em cache ou use o mod_proxy (eu recomendo o mod_proxy).

Se você está bem em deixar o usuário ver a mudança de URL na barra de endereços do 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>

Se você quiser que o "redirecionamento" seja invisível para o usuário, 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>

Deve-se notar que o mod_proxy, quando mal configurado, pode prejudicar sua rede.

    
por 18.01.2013 / 12:29
2

Você pode adicionar ServerAlias example.com ao VirtualHost , mas o desempenho será diferente de um redirecionamento.

Editar

Como você deseja redirecionar e não precisa de funcionalidade avançada, parece que usar Redirect deve ser suficiente para você. Você colocaria o Redirect sob uma diretiva VirtualHost.

Uma solução do lado do cliente seria usar uma tag meta refresh .

por 08.03.2010 / 22:00
1

bem, você pode criar um host virtual para o SERVERNAME www.example.com e redirecioná-lo para outro host virtual com o servername example.com

    
por 08.03.2010 / 22:18