O Nginx não enviará o POST para o backend FastCGI, mas o GET funciona bem?

1

Não tenho certeza do porquê, mas está feliz em enviar um GET para o backend FastCGI (Mercurial hgwebdir neste caso), mas simplesmente recorre ao sistema de arquivos se o pedido for um POST.

Partes relevantes de 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 funciona bem, mas o POST entrega esse erro para o 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"

O que poderia ser o problema? Estou tentando permitir acesso somente leitura via GET para a página, mas preciso de autorização ao usar hg push para o mesmo URL que envia uma solicitação POST.

    
por dlamotte 17.05.2010 / 21:29

2 respostas

1

Se alguém for cavado no buraco que eu fiz, aqui está como eu cavei:

    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;
    }

A parte importante é fastcgi_intercept_errors on; , error_page 401 = @hgauth; e usando location @hgauth { . Não tenho certeza se é possível fazer isso de outra maneira. Por favor, deixe-me saber se esta resposta ajudou!

    
por 17.05.2010 / 22:21
3

Este foi um bug no nginx que foi corrigido em 0.8.48 .

BTW, você precisa usar fastcgi_split_path_info , pois if não é acionado corretamente com limit_except .

Então, no final, algo assim deve funcionar para você:

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;
}
    
por 13.03.2011 / 02:54