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.


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>

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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.