请教一个 nginx rewrite 后导致 POST 请求变成 GET 请求的问题

2018-03-16 09:55:50 +08:00
 yuedingwangji

nginx 开了 80 和 443 端口, 对来自 80 端口的请求做强制跳转到 443 端口,代码如下

     location /
 {
     # rewrite 80 to 443(if use ssl)
     if ( $scheme = http )
     {
         rewrite ^(.*) https://$server_name$request_uri? permanent;
         
     }
}

最近这样写存在很大的问题,因为当 nginx 接受 80 接口的 POST 请求的时候,经过 rewrite 会将请求的方法变成 GET,POST 请求的参数都不见了 有大神遇见过这种情况么 ?该怎么解决

13878 次点击
所在节点    NGINX
12 条回复
smileawei
2018-03-16 10:05:02 +08:00
rerun 307 即可。
kuoruan
2018-03-16 10:05:27 +08:00
小白我一般都是分开 80 和 443 写配置

```
{
listen 80;
server_name *.****;
location / {
return 301 https://*.***$request_uri;
}
}
smileawei
2018-03-16 10:06:11 +08:00
return 307 就不会改变请求方式。
aaronchou0
2018-03-16 10:22:16 +08:00
location /
{
# rewrite 80 to 443(if use ssl)
if ( $scheme = http )
{
rewrite ^(.*$) https://$server_name$1 permanent;

}
}
m939594960
2018-03-16 11:05:09 +08:00
@smileawei 我感觉楼主的意思是用 http 的请求调用 https 的接口,是要 rewrite 不是要 301
smileawei
2018-03-16 11:23:13 +08:00
@m939594960 rewrite +permanent 在浏览器处理就是 301 他的问题应该是跳转以后 原来的 post 的请求变成了 get。换成 307 状态码即可强制要求不能更改之前的方法。
yuedingwangji
2018-03-16 12:57:34 +08:00
@smileawei 嗯 , 我在测试环境下,测了一下,改成 return 307 就正常了 ,但总感觉 307 的状态码怪怪的, 现在都是这么做的么
rrfeng
2018-03-16 13:22:30 +08:00
只有我觉得不应该这么写吗?应该 rewrite 到 https 的首页去。
smileawei
2018-03-16 13:25:46 +08:00
@yuedingwangji 哈哈 307 也是正经的 http 状态码。只是少用而已
yuedingwangji
2018-03-16 14:11:47 +08:00
@smileawei 我知道是正经的状态码,就是好少看到有人用,感觉怪怪的,有点好奇,其他公司,如果开了
80 强制跳转 443,同时又对 80 端口发起 post 请求,都是用 307 状态码的么
gclove
2018-03-16 14:13:25 +08:00
301 是重定向啊

307:对于 POST 请求,表示请求还没有被处理,客户端应该向 Location 里的 URI 重新发起 POST 请求
gclove
2018-03-16 14:13:55 +08:00
一般如果旧系统是 http 要转 https 都要使用 307 重定向

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438555

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX