Nginx反向代理将POST请求转为上游服务器GET请求问题咨询
Nginx反向代理POST转GET问题解决
问题原因
从你提供的访问日志能明确看到:首先是一个POST请求触发了301重定向,随后客户端自动将请求方法改成了GET。这是因为HTTP规范规定,301/302重定向会让客户端把非GET请求转换为GET请求。另外你的Nginx配置里proxy_pass指向的是localhost:3110,但你说明后端服务运行在3210端口,这是明显的配置错误。
修复方案
1. 改用保留请求方法的重定向状态码
把80端口server块里的return 301换成return 307(临时重定向,保留原请求方法和请求体),或者return 308(永久重定向,同样保留请求方法):
server { listen 80; server_name api.mydomain www.api.mydomain; return 307 https://$host$request_uri; }
2. 修正后端端口指向
将443端口server块中的proxy_pass地址改成实际的后端端口3210:
location / { proxy_pass http://localhost:3210; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
3. 重启Nginx生效
修改完配置后执行命令重启Nginx:
sudo nginx -s reload
额外提示
- 尽量让客户端直接请求HTTPS地址,彻底避免重定向带来的方法转换问题。
- 可以用curl命令验证修复效果:
curl -X POST https://api.mydomain/api/v1/user/register -d "test=data" -v
查看请求是否直接到达后端,无重定向跳转。
内容的提问来源于stack exchange,提问作者Vishnu Satheesh
相关产品推荐
相关产品推荐

