Meu servidor proxy roda no ip A e é assim que as pessoas acessam meu serviço 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 nos 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 tirado de como faço para obter nginx para encaminhar solicitações HTTP POST via reescrita?
Tudo o que atingir o IP público atingirá 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 atingia o servidor interno, o nginx interno estava recebendo uma GET
solicitação, mesmo que no cabeçalho original que fizemos POST
(isso foi mostrado no script Python).
Parece que reescrever tem problema. Alguma idéia de como consertar isso? Quando comentei a reescrita, ela atinge 80, com certeza, e passou. Como a reescrita foi capaz de falar com o servidor interno, a reescrita em si não tem problema. É apenas a reescrita caiu POST
para GET
.
Obrigado!
(Isso também será solicitado no fórum do Nginx porque este é um bloqueador crítico ...)
PUT
,POST
,DELETE
,GET
. Na minha configuração anterior, eu não tinha esse proxy extra na frente, servindo a multidão. Eu tinha a mesma configuração no mesmo servidor interno (nosso servidor de teste). Isso funciona bem.GET
. Nenhuma configuração do lado do servidor ou qualquer cabeçalho http retornado não mudará isso. É assim por razões históricas (os primeiros navegadores se comportaram dessa maneira devido a mal-entendidos e se tornaram um padrão de fato).POST
,GET
se ele for redirecionado 301 ou 302. O POST permanecerá no redirecionamento de proxy, mas não na reescrita.If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.
assim, a maioria dos navegadores exibirá uma mensagem de aviso, pois para outros clientes HTTP, eu nem consigo imaginar qual será o comportamento deles.Eu descobri que
POST /api/brand
estava sendo transformadoGET /api/brand
porque o aplicativo Web que eu estava usando (flask-restful
) estava fazendo uma solicitação "inválida". Se eu useiPOST /api/brand/
(observe a trilha/
), foi bem-sucedida.fonte