Nginx https reescreve vira POST para GET

14

Meu servidor proxy é executado no ip A e é assim que as pessoas acessam meu serviço da web. A configuração do nginx será redirecionada para uma máquina virtual no ip B.

Para o servidor proxy no IP A, eu tenho isso em meus sites disponíveis

server {
        listen 443;
        ssl on;
        ssl_certificate nginx.pem;
        ssl_certificate_key nginx.key;

        client_max_body_size 200M;
        server_name localhost 127.0.0.1;
        server_name_in_redirect off;

        location / {
                proxy_pass http://10.10.0.59:80;
                proxy_redirect http://10.10.0.59:80/ /;

                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}

server {
        listen 80;
        rewrite     ^(.*)   https://$http_host$1 permanent;
        server_name localhost 127.0.0.1;
        server_name_in_redirect off;
        location / {
                proxy_pass http://10.10.0.59:80;
                proxy_redirect http://10.10.0.59:80/ /;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

O proxy_redirect foi retirado de como obtenho o nginx para encaminhar solicitações HTTP POST via reescrita?

Tudo o que atingir o IP público atingirá o 443 por causa da reescrita. Internamente, estamos encaminhando para 80 na máquina virtual.

Mas quando eu executo um script python como o abaixo para testar nossa configuração

import requests

data = {'username': '....', 'password': '.....'}
url = 'http://IP_A/api/service/signup'

res  = requests.post(url, data=data, verify=False)
print res
print res.json
print res.status_code
print res.headers

Estou recebendo um 405 Method Not Allowed . No nginx, descobrimos que quando ele atingiu o servidor interno, o nginx interno estava recebendo uma solicitação de GET , mesmo que no cabeçalho original tenhamos feito um POST (isso foi mostrado no script Python).

Então parece que reescrever tem problema. Alguma ideia de como consertar isso? Quando eu comentei a reescrita, ela atinge 80 com certeza, e passou. Como reescrever foi capaz de falar com o nosso servidor interno, então reescrever-se não tem problema. É apenas a reescrita que caiu POST to GET .

Obrigado!

(Isso também será perguntado no fórum do Nginx porque este é um bloqueador crítico ...)

    
por CppLearner 02.10.2012 / 22:38

1 resposta

7

Não é Nginx, é o seu navegador.

Nota do RFC2616:

RFC 1945 and RFC 2068 specify that the client is not allowed to change the method on the redirected request. However, most existing user agent implementations treat 302 as if it were a 303 response, performing a GET on the Location [..]

Isso vale para todos os navegadores populares e não há nada que você possa fazer sobre isso.

    
por 02.10.2012 / 22:49

Tags