Я новичок на этом сайте и надеюсь, что вы поможете мне с проблемой, которая случилась со мной при установке Rhodecode. Вот (длинная) история:
Мне удалось установить Rhodecode внутри virtualenv в окне Linux. Используя сервер разработки (paster serve production.ini
), я вижу, он работает отлично. Однако я хотел использовать Apache в качестве интерфейса для SSL, используя mod_rewrite для перенаправления HTTP-запросов на https. Вот моя конфигурация:
по умолчанию-vhost.conf
<VirtualHost _default_:80>
ServerName hg.mydomain.com
ServerAdmin admin@mydomain.com
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>
Я использую mod_rewrite вместо перенаправления, потому что хочу, чтобы мой сайт был доступен для двух доменных имен. У нас есть сайт по адресу hg.mydomain.com, который мы планируем заменить новым rhodecode.mydomain.com, поэтому я хотел сохранить имя хоста в правиле перезаписи. С помощью этой директивы:
Redirect permanent / https://hg.mydomain.com/
сайт работает отлично и проблем с перенаправлением не возникает. Но когда я перехожу к http://rhodecode.mydomain.com
, Меня перенаправляют на другой сайт, и я не могу этого сделать, пока сайт hg.mydomain.com не будет удален и hg.mydomain.com не будет указывать на тот же IP-адрес, что и rhodecode.mydomain.com.
Эта проблема
Rhodecode иногда включает URL-адреса в ответы на действия, требующие аутентификации. Например, если вы гость и пытаетесь создать частное репо, вы будете перенаправлены на экран входа в систему с таким URL-адресом:
https://rhodecode.mydomain.com/_admin/login?came_from=%2F
где% 2F - это закодированный '/'.
После входа меня перенаправляют на https://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
, и отображается страница apache по умолчанию для ошибки 404. После этого переход к https://rhodecode.mydomain.com/
показывает, что я нахожусь на сайте. Почему меня перенаправляют на этот странный документ HTTP_NOT_FOUND.html.var ?? Вот остальная часть моей конфигурации и соответствующие части журналов:
по умолчанию-vhost-ssl.conf
<VirtualHost _default_:443>
ServerName hg.mydomain.com
ServerAdmin admin@mydomain.com
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>
Переписать журнал
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]
Обратите внимание на рид # 7f69fd68d7a0 / initial /редир # 1 часть. Когда я отправляю URL-адреса без% 2F, эта часть не отображается в журнале.
Журнал доступа
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"
Первая строка - это запрос POST с данными аутентификации. Это успешно, поэтому он перенаправляет меня на страницу администратора. Во второй строке вы можете увидеть, что местоположение перенаправления отправило меня обратно на http (он вошел в порт 80) на / _admin /% 2F и, как таковой, перенаправляется на https, но волшебным образом преобразуется в /error/HTTP_NOT_FOUND.html.var
HTTP-запрос (Некоторые заголовки опущены для краткости)
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
...
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
...
HTTP-запрос 2
GET /_admin/%2F HTTP/1.1
Host: rhodecode.mydomain.com
Cache-Control: no-cache
Pragma: no-cache
Cookie: rhodecode=f0a94a155738490da032b46354f4d72338902da2d69bc1177bcf4086aa8158f4719526e0
...
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
...
И, наконец, попытка получить /error/HTTP_NOT_FOUND.html.var дает мне не ошибку 404, а ответ 200 OK !!
Я думал, что браузеры делают что-то странное под капотом, поэтому я отправил необработанный HTTP-запрос и получил те же результаты:
[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>
Посмотрите на заголовок локации в ответе. Почему Apache делает это вместо того, чтобы просто изменить запрос на https ???
Извините за длинный текст моего вопроса, но я хотел дать как можно больше информации, чтобы вы могли помочь мне отладить это :)
Заранее всем спасибо!
редактировать
Как и было предложено, я хотел узнать, отправляет ли Rhodecode перенаправления. Поэтому я изменил свой сценарий wsgi на тот, который показан в документации: http://modwsgi.readthedocs.org/en/latest/configuration-guides/running-a-basic-application.html#wsgi-application-script-file
. Он всегда возвращает «Hello World» без возможности перенаправления. Я отправил необработанный запрос на сайт с теми же результатами, поэтому Apache должен каким-то образом изменить URL-адрес. Вот результат:
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>
Но когда я отправляю обычный URL (без% 2F), он перенаправляет ОК:
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
Apache, похоже, не любит% 2F ...
RhodeCode также имеет специальный флаг, который сообщает ему, что вы хотите принудительно использовать ssl, что означает, что все перенаправления всегда будут идти на https.
У вас изменение флага .ini:
force_ssl = истина
Оказалось, что причиной этой ошибки были две причины. Во-первых, это значение по умолчанию AllowEncodedSlashes из документы:
With the default value, Off, URLs which contain encoded path separators (%2F for / and additionally %5C for \ on according systems) are refused with a 404 (Not found) error.
Я обнаружил это, включив максимальную детализацию в журналах apache, и обнаружил следующее:
[Mon Mar 10 04:53:43 2014] [info] [client 172.17.1.49] found %2f (encoded '/') in URI (decoded='//'), returning 404
Таким образом, все мои запросы с% 2F были отклонены. Кроме того, у меня была эта конфигурация, которая по умолчанию была на моем сервере:
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory "/usr/share/apache2/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en cs de es fr it ja ko nl pl pt-br ro sv tr
ForceLanguagePriority Prefer Fallback
</Directory>
ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
ErrorDocument 410 /error/HTTP_GONE.html.var
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
</IfModule>
</IfModule>
Таким образом, каждый раз, когда клиенту отправлялась ошибка 404, фильтр "Включает" в сочетании с ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
директива вызвала перенаправление в браузер на http://rhodecode.mydomain.com/error/HTTP_NOT_FOUND.html.var
Вы можете увидеть это поведение в моих журналах перезаписи, где выражение, которое нужно перезаписать, инициализируется с помощью /error/HTTP_NOT_FOUND.html.var:
172.17.1.49 - - [10/Mar/2014:04:04:23 +0000] [rhodecode.mydomain.com/sid#7f98fedd7f00][rid#7f98f91fe7a0/initial/redir#1] (2) init rewrite engine with requested uri /error/HTTP_NOT_FOUND.html.var
Также обратите внимание, что редир # 1 указывает на то, что произошло внутреннее перенаправление. Итак, я изменил свою конфигурацию на
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
AllowEncodedSlashes NoDecode
И изменил директиву ifmodule на
<IfModule !mod_include.c>
так что никакие директивы ErrorDocument не выполняются, и все работает отлично!
На этот раз журналы перезаписи показывают% 2F в URL-адресе, и повторное изменение не происходит:
172.17.1.49 - - [10/Mar/2014:04:55:40 +0000] [rhodecode.mydomain.com/sid#7f9fd1f83f00][rid#7f9fcc3a90a0/initial] (2) init rewrite engine with requested uri /%2F