.htaccess não redireciona para página prefixada em www corretamente

9

Estou tentando redirecionar uma URL sem www. para www.version (example.com para www.example.com). Eu uso o habitual

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: eu tentei enrolar a versão não-www para ver quais cabeçalhos ela envia usando %código%. 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 o seguinte:

<!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)? Quaisquer outras diretivas de reescrita de url funcionarão bem.

EDITAR: reescrever log continha isto: (o site é acessado por muitas pessoas, então o registro de reescrita ficou bastante longo, não tenho 100% de certeza se essa é a parte correta)

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 linha 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 virtualhost:

<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: tudo bem, eu acabei de descobrir que, se eu fizer isso (resignado e tentar redirecionar isso sem o .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 o loop de redirecionamento EXATAMENTE O MESMO . Sério, que diabos? Alguém tem uma ideia do que poderia estar causando isso?

    
por cypher 06.06.2011 / 16:57

11 respostas

2

O que me parece estranho é a linha de cabeçalho Location: http://domain.cz/ informada pela 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 cabeçalho Location parece ser alterado depois que modrewrite faz o seu material, e desde que você tentou alterar o cabeçalho com o PHP também, o Location header aparentemente foi alterado após o processamento da requisição. A única explicação que posso pensar é que você está modificando o cabeçalho de localização com o 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 em algum lugar encontrar uma linha semelhante a esta:

Header set Location (...)

ou

Header edit Location (...)
    
por 25.08.2011 / 18:07
1

Além de ativar o rewritelog (se você tiver acesso para alterar o httpd.conf), remova o aplicativo que mora neste site da equação. Remova / renomeie temporariamente o index.php padrão (ou qualquer página de índice que esteja servindo seu aplicativo) para ter certeza de que não está causando isso.

Existem muitos relatórios de aplicativos (por exemplo, wordpress) que fazem com que a página de redirecionamento padrão do apache apareça se forem configurados 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.

    
por 06.06.2011 / 18:07
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]
    
por 06.06.2011 / 17:23
0

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

    
por 10.06.2011 / 16:09
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 essa linha no httaccess para iniciar / alterar a parte.

Pode ser que você não tenha adicionado "RewriteEngine on" antes do redirecionamento.

    
por 15.06.2011 / 10:36
0

Tente:

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

Certifique-se de ter Options +FollowSymLinks se 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>
    
por 16.06.2011 / 11:41
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.

    
por 24.08.2011 / 20:00
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 este for o caso, existe um proxy entre você e o servidor. Esse proxy provavelmente usa ProxyPassReverse ou Header edit para alterar o cabeçalho Location .

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

Se realmente houver um servidor proxy, você terá que 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 durante todo o tempo que estivemos olhando para o servidor errado: O problema é com o servidor proxy!

    
por 30.08.2011 / 16:22
0

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

hexdump -C .htaccess
    
por 30.08.2011 / 19:09
0

Eu acredito que você está perdendo um sinal $ após sua condição de reescrita. Por favor, tente:

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