
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 请求的参数都不见了 有大神遇见过这种情况么 ?该怎么解决
1 smileawei 2018-03-16 10:05:02 +08:00 via iPhone rerun 307 即可。 |
2 kuoruan 2018-03-16 10:05:27 +08:00 小白我一般都是分开 80 和 443 写配置 ``` { listen 80; server_name *.****; location / { return 301 https://*.***$request_uri; } } |
3 smileawei 2018-03-16 10:06:11 +08:00 via iPhone return 307 就不会改变请求方式。 |
4 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; } } |
5 m939594960 2018-03-16 11:05:09 +08:00 @smileawei 我感觉楼主的意思是用 http 的请求调用 https 的接口,是要 rewrite 不是要 301 |
6 smileawei 2018-03-16 11:23:13 +08:00 @m939594960 rewrite +permanent 在浏览器处理就是 301 他的问题应该是跳转以后 原来的 post 的请求变成了 get。换成 307 状态码即可强制要求不能更改之前的方法。 |
7 yuedingwangji OP @smileawei 嗯 , 我在测试环境下,测了一下,改成 return 307 就正常了 ,但总感觉 307 的状态码怪怪的, 现在都是这么做的么 |
8 rrfeng 2018-03-16 13:22:30 +08:00 via Android 只有我觉得不应该这么写吗?应该 rewrite 到 https 的首页去。 |
9 smileawei 2018-03-16 13:25:46 +08:00 @yuedingwangji 哈哈 307 也是正经的 http 状态码。只是少用而已 |
10 yuedingwangji OP @smileawei 我知道是正经的状态码,就是好少看到有人用,感觉怪怪的,有点好奇,其他公司,如果开了 80 强制跳转 443,同时又对 80 端口发起 post 请求,都是用 307 状态码的么 |
11 gclove 2018-03-16 14:13:25 +08:00 301 是重定向啊 307:对于 POST 请求,表示请求还没有被处理,客户端应该向 Location 里的 URI 重新发起 POST 请求 |
12 gclove 2018-03-16 14:13:55 +08:00 一般如果旧系统是 http 要转 https 都要使用 307 重定向 |