Sou novo no site e espero que você possa me ajudar com um problema que aconteceu comigo ao tentar instalar o Rhodecode. Aqui está a (longa) história:
Eu consegui instalar Rhodecode dentro de um virtualenv em uma caixa linux. Usando o servidor de desenvolvimento ( paster serve production.ini
), vejo que está funcionando perfeitamente. No entanto, eu queria usar o Apache como frontend para SSL, usando mod_rewrite para redirecionar solicitações http para https. Aqui está minha configuração:
default-vhost.conf
<VirtualHost _default_:80>
ServerName hg.mydomain.com
ServerAdmin [email protected]
ServerAlias rhodecode.mydomain.com
DocumentRoot "/srv/www/htdocs"
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
HostnameLookups Off
UseCanonicalName Off
ServerSignature Off
....
</VirtualHost>
Eu uso mod_rewrite em vez de um redirecionamento porque quero que meu site seja acessado por dois nomes de domínio. Temos um site em hg.mydomain.com que estamos planejando substituir com o novo rhodecode.mydomain.com, então eu queria preservar o nome do host na regra de reescrita. Com esta diretiva:
Redirect permanent / https://hg.mydomain.com/
o site funciona perfeitamente e nenhum problema de redirecionamento ocorre. Mas quando eu navego para http://rhodecode.mydomain.com
, eu sou redirecionado para o outro site, e não posso fazer isso até que o site em hg.mydomain.com seja descartado e hg.mydomain.com aponte para o mesmo IP que o código de rodapé.mydomain .com.
O problema
Às vezes, o Rhodecode inclui urls em respostas a ações que exigem autenticação. Por exemplo, se você é um convidado e tenta participar de um repositório privado, é redirecionado para a tela de login com uma URL como esta:
https://rhodecode.mydomain.com/_admin/login?came_from=%2F
onde o% 2F é um '/' codificado.
Após o login, sou redirecionado para https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
e a página padrão do apache para um erro 404 é exibida. Depois disso, navegar para https://rhodecode.mydomain.com/
mostra que estou em sessão no site. Por que eu fui redirecionado para aquele estranho documento HTTP_NOT_FOUND.html.var? Aqui está o resto da minha configuração e as partes relevantes dos logs:
default-vhost-ssl.conf
<VirtualHost _default_:443>
ServerName hg.mydomain.com
ServerAdmin [email protected]
ServerAlias rhodecode.mydomain.com
DocumentRoot "/srv/www/htdocs"
HostnameLookups Off
UseCanonicalName Off
ServerSignature Off
SSLEngine on
certificate stuff ...
WSGIDaemonProcess hg.mydomain.com user=rhodecode group=users threads=5 \
home=/home/rhodecode/rhodecode-env python-path=/home/rhodecode/rhodecode-env/lib/python2.7/site-packages
WSGIScriptAlias / /home/rhodecode/rhodecode-env/dispatch.wsgi
WSGIPassAuthorization On
<Directory /home/rhodecode/rhodecode-env>
WSGIProcessGroup hg.mydomain.com
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Regravar Log
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (2) init rewrite engine with requested uri /error/HTTP_NOT_FOUND.html.var
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (3) applying pattern '(.*)' to uri '/error/HTTP_NOT_FOUND.html.var'
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (4) RewriteCond: input='off' pattern='off' => matched
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (2) rewrite '/error/HTTP_NOT_FOUND.html.var' -> 'https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var'
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (2) explicitly forcing redirect with https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (1) escaping https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var for redirect
172.17.1.49 - - [04/Mar/2014:00:06:24 +0000] [rhodecode.mydomain.com/sid#7f6a03266f00][rid#7f69fd68d7a0/initial/redir#1] (1) redirect to https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var [REDIRECT/301]
Preste atenção na parte gratuita # 7f69fd68d7a0 / initial / redir # 1 . Quando eu envio URLs sem% 2F, essa parte não aparece no log.
Log de acessos
hg.mydomain.com:443 172.17.1.49 - - [04/Mar/2014:02:09:13 +0000] "POST /_admin/login?came_from=%252F HTTP/1.1" 302 186 "https://rhodecode.mydomain.com/_admin/login?came_from=%252F" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
hg.mydomain.com:80 172.17.1.49 - - [04/Mar/2014:02:09:14 +0000] "GET /_admin/%2F HTTP/1.1" 301 268 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
hg.mydomain.com:443 172.17.1.49 - - [04/Mar/2014:02:09:14 +0000] "GET /error/HTTP_NOT_FOUND.html.var HTTP/1.1" 200 1132 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
hg.mydomain.com:443 172.17.1.49 - - [04/Mar/2014:02:09:14 +0000] "GET /favicon.ico HTTP/1.1" 404 618 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
A primeira linha é a solicitação POST com os dados de autenticação. É bem-sucedido, então me redireciona para a página de administração. Na segunda linha, você pode ver o local de redirecionamento me mandou de volta para http (ele inseriu a porta 80) para / _admin /% 2F e, como tal, foi redirecionado para https mas magicamente transformado para /error/HTTP_NOT_FOUND.html.var
Solicitação HTTP
(Alguns cabeçalhos omitidos por brevidade)
POST /_admin/login?came_from=%252F HTTP/1.1
Host: rhodecode.mydomain.com
Cache-Control: no-cache
Pragma: no-cache
Origin: https://rhodecode.mydomain.com
Content-Type: application/x-www-form-urlencoded
Referer: https://rhodecode.mydomain.com/_admin/login?came_from=%252F
Cookie: rhodecode=3af58050ce87a93caa5a4c6809c5dacef4afb29d8e74b152c97f469199c554b6f67f7aa7
...
Resposta HTTP
HTTP/1.1 302 Found
Date: Tue, 04 Mar 2014 02:24:11 GMT
Server: Apache/2.2.22 (Linux/SUSE)
Pragma: no-cache
Cache-Control: no-cache
Set-Cookie: rhodecode=f0a94a155738490da032b46354f4d72338902da2d69bc1177bcf4086aa8158f4719526e0; httponly; Path=/
Location: http://rhodecode.mydomain.com/_admin/%2F
...
Solicitação HTTP 2
GET /_admin/%2F HTTP/1.1
Host: rhodecode.mydomain.com
Cache-Control: no-cache
Pragma: no-cache
Cookie: rhodecode=f0a94a155738490da032b46354f4d72338902da2d69bc1177bcf4086aa8158f4719526e0
...
Resposta HTTP 2
HTTP/1.1 301 Moved Permanently
Date: Tue, 04 Mar 2014 02:24:12 GMT
Server: Apache/2.2.22 (Linux/SUSE)
Location: https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
...
E finalmente, tentar obter /error/HTTP_NOT_FOUND.html.var não me causa um erro 404, mas uma resposta 200 OK !!
Eu achei que os navegadores estavam fazendo algo estranho, então enviei uma solicitação HTTP bruta e obtive os mesmos resultados:
[Rober@yue ~]$ nc rhodecode.mydomain.com 80
GET /%2F HTTP/1.1
Host: rhodecode.mydomain.com
HTTP/1.1 301 Moved Permanently
Date: Tue, 04 Mar 2014 00:07:26 GMT
Server: Apache/2.2.22 (Linux/SUSE)
Location: https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
Content-Length: 268
Content-Type: text/html; charset=iso-8859-1
<!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="https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var">here</a>.</p>
</body></html>
Veja o cabeçalho da localização na resposta. Por que o Apache está fazendo isso em vez de apenas alterar a solicitação para https ???
Desculpe pelo texto mudo da minha pergunta, mas eu queria dar o máximo de informação possível para que você possa me ajudar a depurar isso:)
Obrigado a todos antecipadamente!
Editar
Como sugerido, queria descobrir se o Rhodecode estava enviando os redirecionamentos. Então eu mudei meu script wsgi para o mostrado na documentação: http://modwsgi.readthedocs.org/en/latest/configuration-guides/running-a-basic-application.html#wsgi-application-script-file
. Ele sempre retorna um "Hello World" sem a possibilidade de redirecionamento. Enviei uma solicitação bruta para o site com os mesmos resultados, então o Apache deve estar alterando a URL de alguma forma. Aqui está o resultado:
GET /%2F HTTP/1.1
Host: rhodecode.mydomain.com
HTTP/1.1 301 Moved Permanently
Date: Thu, 06 Mar 2014 04:23:31 GMT
Server: Apache/2.2.22 (Linux/SUSE)
Location: https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
Content-Length: 268
Content-Type: text/html; charset=iso-8859-1
<!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="https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var">here</a>.</p>
</body></html>
Mas quando eu envio uma URL normal (sem% 2F), ela redireciona OK:
GET /abffr HTTP/1.1
Host: rhodecode.mydomain.com
HTTP/1.1 301 Moved Permanently
Date: Thu, 06 Mar 2014 04:25:19 GMT
Server: Apache/2.2.22 (Linux/SUSE)
Location: https://rhodecode.mydomain.com/abffr
Content-Length: 244
Content-Type: text/html; charset=iso-8859-1
O Apache parece não gostar da coisa% 2F ...