Redirecionar URL no Apache VirtualHost?

61

Eu tenho um servidor dedicado com Apache, no qual configurei alguns VirtualHosts. Eu configurei um para lidar com o domínio www e também 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 isso .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 as duas versões para a mesma DocumentRoote usando, .htaccessmas tenho certeza de que devo fazê-lo no arquivo VirtualHost.

DisgruntledGoat
fonte

Respostas:

105

Acontece que as mod_rewriteregras são boas no arquivo VirtualHosts, além da RewriteBaseregra. 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: no conselho de joschi nos comentários, agora estou usando esta versão simplificada usando a Redirectdiretiva de mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
DisgruntledGoat
fonte
2
Você não precisa de mod_rewrite para isso. Use mod_alias e sua diretiva RedirectPermanent.
Joschi
@joschi: Qual seria a vantagem disso? É mais rápido?
usar o seguinte
12
Você não precisa do mecanismo de reescrita completo com todas as suas verificações e possibilidades para redirecionar apenas o cliente. Seria (marginalmente) mais rápido, pois mod_alias não é tão complexo quanto mod_rewrite e você precisaria apenas de uma diretiva (RedirectPermanent) em vez de duas com mod_rewrite. E por último, mas não menos importante, o IMHO é mais fácil entender o que acontece na configuração quando alguém olha para ela pela primeira vez.
Joschi
11
Por algum motivo estranho, o Redirecionamento 301 .. não funcionou para nós. Tivemos que usar a opção RewriteRule.
so_mv
OBSERVAÇÃO: O uso do PHP 5.3.0 no WAMPSERVER 2.0 no Windows Server 2008 R2 Enterprise, sem incluir o comando :80after, VirtualHost *faz com que tudo retorne "Proibido"!
Cees Timmerman
4

Tenha muito cuidado com os redirecionamentos 301, porque, por padrão, um navegador que recebe o redirecionamento 301 o armazenará permanentemente - o que significa que você deixará de controlar o que o navegador verá ao tentar acessar o domínio www.example.com.

Veja, por exemplo, esta discussão http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Portanto, verifique se ele não é armazenado em cache ou use mod_proxy (eu recomendo o mod_proxy).

Se você não permitir que o usuário veja a alteração do URL na barra de endereço 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ê deseja que o "redirecionamento" fique 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>

Note-se que mod_proxy, quando mal configurado, pode prejudicar sua rede.

Marco Trevisan
fonte
5
O objetivo de um 301 é que ele é um redirecionamento permanente ; Se você deseja um redirecionamento não permanente, use 302 ou 307.
nickgrim
2

Você pode adicionar ServerAlias example.comao, VirtualHostmas o desempenho será diferente de um redirecionamento.

Editar

Como você deseja redirecionar e não precisa de funcionalidade avançada, parece que o uso Redirectdeve ser suficiente para você. Você colocaria a Redirectsob uma diretiva VirtualHost.

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

Atalaia, vigia, avisador
fonte
Você pode explicar um pouco mais? Como eu redirecionaria www.example.compara example.comusar esse método?
usar o seguinte
No seu host principal, você tem entradas para ambos ServerNamee ServerAlias. Um tem example.com e o outro www.example.com. Em seguida, as duas entradas DNS acessarão os documentos especificados no mesmo vhost.
Warner
Eu quero fazer um redirecionamento , não apenas um alias.
usar o seguinte
A recomendação de joshchi pode ser uma boa abordagem para você. Parece que os cabelos estão sendo cortados neste momento.
Warner
1

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

Devin Ceartas
fonte