我的代理服务器在ip A上运行,这就是人们访问我的web服务的方式。 nginxconfiguration将redirect到ip B.上的虚拟机。
对于IP A上的代理服务器,我在我的站点中有这个function
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; } }
proxy_redirect是从我如何获得nginx通过重写转发HTTP POST请求?
所有打到公共IP的东西都会因为重写而打到443。 在内部,我们在虚拟机上转发到80。
但是当我运行一个如下所示的python脚本来testing我们的configuration
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
我得到了405 Method Not Allowed 。 在nginx中,我们发现当它打到内部服务器时,内部的nginx得到了一个GET请求,即使在原始头文件中,我们做了一个POST (这在Python脚本中显示)。
所以好像重写有问题。 任何想法如何解决这个问题? 当我把这个重写的注释掉的时候,肯定会打到80,然后就结束了。 由于重写能够与我们的内部服务器交谈,所以重写本身没有问题。 这只是重写丢弃POST到GET 。
谢谢!
(这也将在Nginx论坛上被问到,因为这是一个关键的拦截器…)
这不是Nginx,它是你的浏览器。
RFC2616的注意事项:
RFC 1945和RFC 2068指定客户端不允许更改redirect请求上的方法。 然而,大多数现有的用户代理实现将302视为303响应,在位置[..]上执行GET,
对于所有stream行的浏览器都是如此,并且您无能为力。