技术解析

请教一个 nginx rewrite 后导致 POST 请求变成 GET 请求的问题
0
2021-05-21 00:09:49
idczone

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 请求的参数都不见了 有大神遇见过这种情况么 ?该怎么解决


rerun 307 即可。

小白我一般都是分开 80 和 443 写配置
```
{
listen 80;
server_name *.****;
location / {
return 301 https://*.***$request_uri;
}
}

return 307 就不会改变请求方式。

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

}
}

我感觉楼主的意思是用 http 的请求调用 https 的接口,是要 rewrite 不是要 301

rewrite +permanent 在浏览器处理就是 301 他的问题应该是跳转以后 原来的 post 的请求变成了 get。换成 307 状态码即可强制要求不能更改之前的方法。

嗯 , 我在测试环境下,测了一下,改成 return 307 就正常了 ,但总感觉 307 的状态码怪怪的, 现在都是这么做的么

只有我觉得不应该这么写吗?应该 rewrite 到 https 的首页去。

哈哈 307 也是正经的 http 状态码。只是少用而已

我知道是正经的状态码,就是好少看到有人用,感觉怪怪的,有点好奇,其他公司,如果开了
80 强制跳转 443,同时又对 80 端口发起 post 请求,都是用 307 状态码的么

301 是重定向啊
307:对于 POST 请求,表示请求还没有被处理,客户端应该向 Location 里的 URI 重新发起 POST 请求

一般如果旧系统是 http 要转 https 都要使用 307 重定向

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服