Nginx не отправляет POST в бэкэнд FastCGI, но GET работает нормально?
Не уверен, почему, но он рад отправке GET в бэкэнд FastCGI (в данном случае Mercurial hgwebdir), но просто обращается к файловой системе, если запрос POST.
Соответствующие части nginx.conf
:
location / {
root /var/www/htdocs/;
index index.html;
autoindex on;
}
location /hg {
fastcgi_pass unix:/var/run/hg-fastcgi.socket;
include fastcgi_params;
if ($request_uri ~ ^/hg([^?#]*)) {
set $rewritten_uri $1;
}
limit_except GET {
allow all;
deny all;
auth_basic "hg secured repos";
auth_basic_user_file /var/trac.htpasswd;
}
fastcgi_param SCRIPT_NAME "/hg";
fastcgi_param PATH_INFO $rewritten_uri;
# for authentication
fastcgi_param AUTH_USER $remote_user;
fastcgi_param REMOTE_USER $remote_user;
#fastcgi_pass_header Authorization;
#fastcgi_intercept_errors on;
}
GET работает нормально, но POST доставляет эту ошибку в error_log:
2010/05/17 14:12:27 [error] 18736#0: *1601 open() "/usr/html/hg/test" failed (2: No such file or directory), client: XX.XX.XX.XX, server: domain.com, request: "POST /hg/test HTTP/1.1", host: "domain.com"
В чем может быть проблема? Я пытаюсь разрешить доступ только для чтения через GET на страницу, но при использовании требуется авторизация hg push
на тот же URL, который отправляет запрос POST.
2 ответа
Если кого-нибудь закопают в дыру, которую я сделал, вот как я выкопал:
location /hg {
fastcgi_pass unix:/var/run/hg-fastcgi.socket;
include fastcgi_params;
if ($request_uri ~ ^/hg([^?#]*)) {
set $rewritten_uri $1;
}
rewrite ^/hg$ /hg/ redirect;
fastcgi_param SCRIPT_NAME "/hg";
fastcgi_param PATH_INFO $rewritten_uri;
# for authentication
fastcgi_param AUTH_USER $remote_user;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_intercept_errors on;
error_page 401 = @hgauth;
}
location @hgauth {
fastcgi_pass unix:/var/run/hg-fastcgi.socket;
include fastcgi_params;
if ($request_uri ~ ^/hg([^?#]*)) {
set $rewritten_uri $1;
}
auth_basic "hg secured repos";
auth_basic_user_file /var/trac.htpasswd;
fastcgi_param SCRIPT_NAME "/hg";
fastcgi_param PATH_INFO $rewritten_uri;
# for authentication
fastcgi_param AUTH_USER $remote_user;
fastcgi_param REMOTE_USER $remote_user;
}
Важная часть fastcgi_intercept_errors on;
, error_page 401 = @hgauth;
и используя location @hgauth {
, Я не уверен, что это можно сделать любым другим способом. Пожалуйста, дайте мне знать, если этот ответ помог!
Это была ошибка в nginx, которая была исправлена в 0.8.48.
Кстати, вы должны использовать fastcgi_split_path_info
как if
не срабатывает правильно с limit_except
,
Так что в итоге у вас должно получиться что-то подобное:
location /hg {
fastcgi_pass unix:/var/run/hg-fastcgi.socket;
include fastcgi_params;
limit_except GET HEAD {
auth_basic "hg secured repos";
auth_basic_user_file /var/trac.htpasswd;
}
fastcgi_split_path_info ^(/hg)(.*)$;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# for authentication
fastcgi_param AUTH_USER $remote_user;
fastcgi_param REMOTE_USER $remote_user;
}