.htaccess não redireciona para a página com prefixo www corretamente


9

Estou tentando redirecionar um URL sem www. para www.version (exemplo.com para www.exemplo.com). Eu uso o de sempre

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

Isso funciona em todos os meus outros projetos. No entanto, neste site específico, ele termina com um loop de redirecionamento. Aqui está a parte estranha: tentei enrolar a versão não www para ver quais cabeçalhos ela envia usando curl --get http://example.com --dump-header domain.header > domain.html. O arquivo de cabeçalho ficou assim:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

No entanto, o arquivo HTML resultante foi este:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(observe a diferença de endereço entre os arquivos) Alguém sabe como consertar isso (e o que diabos está causando isso)? Qualquer outra diretiva de reescrita de URL funciona bem.

EDIT: reescrever log continha isso: (o site é acessado por muitas pessoas, portanto o reescrito log ficou muito longo, não tenho 100% de certeza se esta é a parte certa)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

A linha do log de acesso (provavelmente a correta):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

A definição do host virtual:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2: ok, acabei de descobrir que se eu fizer isso (renunciou e tentou redirecionar isso sem .htaccess):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

Causa exatamente o mesmo loop de redirecionamento. Sério, que diabos? Alguém tem uma idéia do que pode estar causando isso?


Você mesmo compilou o Apache? Deveria ser impossível para o cabeçalho Location diferir do que está na página, pois eles são retirados da mesma variável nesse caso, então isso é bem estranho. Eu assumo que as solicitações são passadas diretamente para o Apache, certo, não há outro servidor entre elas?
Tim Pedra

Eu não compilei o apache e não há outro servidor no meio.

Provavelmente seu servidor NS não está configurado corretamente
venimus

4
Não é necessário repetir o nome do servidor na entrada ServerAlias.
chris

você pode colocar todo o conteúdo do arquivo aqui
desfeito

Respostas:


2

O que me parece estranho é a Location: http://domain.cz/linha de cabeçalho relatada pelo CURL. Você nunca redireciona para esse domínio. O log de redirecionamento também não contém nenhuma menção a ele.

De alguma forma, o Locationcabeçalho parece ser alterado após o modrewrite fazer o seu trabalho, e desde que você tentou alterar o cabeçalho também com PHP, o Locationcabeçalho aparentemente é alterado após o processamento da solicitação. A única explicação que consigo pensar é que você está modificando o cabeçalho do local com mod_header em algum lugar.

Você verificou todos os arquivos de configuração (httpd.conf, os arquivos .conf incluídos e o arquivo .htaccess) se encontrar em algum lugar uma linha semelhante a esta:

Header set Location (...)

ou

Header edit Location (...)

Eu não encontrei nada assim.

2
Você está se conectando diretamente ao Apache ou existe algum servidor proxy ou de cache que possa alterar os cabeçalhos? A diretiva ProxyPassReverse também pode alterar o cabeçalho do local ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).

pode haver algum proxy entre eles, vou dar uma olhada nele assim que chegar ao trabalho amanhã.

@ Jakob Egger - Eu não encontrei a diretiva ProxyPassReverse em nenhum lugar.
cifra

1

Além de ativar a reescrita (se você tiver acesso para alterar o httpd.conf), remova da equação o aplicativo que vive neste site. Remova / renomeie temporariamente o index.php padrão (ou qualquer outra página de índice que esteja fornecendo seu aplicativo) para garantir que não esteja causando isso.

Existem muitos relatórios de aplicativos (por exemplo, wordpress) fazendo com que essas páginas de redirecionamento padrão do apache apareçam se estiverem configuradas incorretamente.

Além disso, verifique o restante da configuração do apache para ver se há outras instruções de 'redirecionamento' que possam estar em conflito.


O aplicativo está bom, tentei em um servidor e domínio diferentes (copiei o aplicativo inteiro) e funcionou bem. Eu acho que é algo na configuração do apache, mas não consigo descobrir o que.

O aplicativo pode estar ok, mas também pode estar em conflito com a configuração deste servidor. Parece que seu aplicativo está atualmente em produção para que eu possa ver como 'desativá-lo' não é o ideal. Por diversão, você pode adicionar uma string de consulta ao final do redirecionamento como um sinalizador para ajudar na descoberta - então / $ 1? Nowww = 1 ou algo semelhante.
Gavin C

Não, NÃO está em produção.

Oh legal, em seguida, não pode ferir a mover o arquivo de índice fora do caminho a 100% excluí-lo como parte do problema :)
Gavin C

Oh, maldito, o que eu pretendia escrever era que tis está em produção, não sei como isso happenned :-)

0

Você pode tentar este código mod_rewrite alternativo:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Isso falhou exatamente da mesma maneira.

você pode ativar o RewriteLog e ver o que ele expõe.
Anubhava

E como exatamente eu posso fazer isso? :-)

Por favor, veja aqui: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog A única coisa é que esta diretiva entra na configuração do apache NÃO em .htaccess.
Anubhava

1
Copiei a mesma regra (como minha resposta acima) para a instalação do Apache e executei o mesmo comando curl que você tem na sua pergunta e peguei Location: http://www.domain.com/como parte dos meus cabeçalhos, portanto, no meu caso, cabeçalhos e html exibem o mesmo domínio, por exemplo www.domain.com. Você também pode colar as linhas relevantes access.log na sua pergunta acima?
Anubhava

0

você poderia tentar usar [NC] em vez de [nc], pode ser tão simples


E ainda não é :-) (já tentei, não funcionou)

0

Espero que você tenha acesso ao servidor, Adicionado a linha de redirecionamento após a pasta de documentos do site especificada seguida

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

Se você não tiver acesso ao servidor, adicione essas linhas emcessaccess iniciando / altere a parte.

Talvez você não tenha adicionado "RewriteEngine on" antes do redirecionamento.


Eu adicionei RewriteEngine on, como eu disse, ele funciona em outro servidor corretamente, mas não neste.

AllowOverride All allow from all adicionar essas linhas em seu arquivo de configuração do servidor

0

Tentar:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

0

Certifique-se de ter Options +FollowSymLinksse estiver trabalhando em um contexto de diretório.

Caso contrário, se você estiver usando hosts virtuais baseados em nome, tente:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

Atualizei a pergunta com a definição do VirtualHost.

Você tentou a solução VirtualHost múltipla acima ou tentou usar o mod_rewrite?
chris

No começo, eu não queria usar vários VirtualHosts, mas, dadas as circunstâncias, tentei mesmo assim e não ajudou.

0

Depois de ler todas as respostas, você pode verificar o arquivo de / etc / hosts ... talvez todas as suas verificações sejam do seu computador. Tente acessar de um local diferente.


Não, nada nos hosts sobre esse domínio.

0

Eu tenho uma segunda ideia. O log do servidor que você postou mostra um endereço "192.168.1.221", que é um endereço da rede local. Todas as entradas de log mostram o mesmo endereço IP? Se for esse o caso, existe um proxy entre você e o servidor. Esse proxy provavelmente usa ProxyPassReverseou Header editpara alterar o Locationcabeçalho.

Essa é uma configuração usual para contornar o problema quando o servidor back-end coloca seu próprio nome de host no Locationcabeçalho, em vez do nome do host do servidor proxy externo.

Se realmente houver um servidor proxy, você precisará alterar a configuração do servidor proxy em vez da configuração do servidor back-end, pois o proxy sempre substituirá as informações.

Isso significa que sempre procuramos o servidor errado: o problema está no servidor proxy!


Amanhã telefonarei para o suporte técnico da empresa que administra este servidor. Eu acho que deve ser isso, eu vou deixar você saber.
Cypher

0

Podem ser caracteres não imprimíveis como nulo no .htaccessarquivo.

hexdump -C .htaccess

0

Acredito que você esteja perdendo um sinal de $ após sua condição de reescrita. Tente por favor:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
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.