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?
Respostas:
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
Location
cabeç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, oLocation
cabeç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:
ou
fonte
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.
fonte
Você pode tentar este código mod_rewrite alternativo:
fonte
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 exemplowww.domain.com
. Você também pode colar as linhas relevantes access.log na sua pergunta acima?você poderia tentar usar [NC] em vez de [nc], pode ser tão simples
fonte
Espero que você tenha acesso ao servidor, Adicionado a linha de redirecionamento após a pasta de documentos do site especificada seguida
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.
fonte
RewriteEngine on
, como eu disse, ele funciona em outro servidor corretamente, mas não neste.Tentar:
fonte
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:
fonte
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.
fonte
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
ProxyPassReverse
ouHeader edit
para alterar oLocation
cabeçalho.Essa é uma configuração usual para contornar o problema quando o servidor back-end coloca seu próprio nome de host no
Location
cabeç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!
fonte
Podem ser caracteres não imprimíveis como nulo no
.htaccess
arquivo.fonte
Acredito que você esteja perdendo um sinal de $ após sua condição de reescrita. Tente por favor:
fonte