V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
yuedingwangji
V2EX  ›  NGINX

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

  •  
  •   yuedingwangji · 2018-03-16 09:55:50 +08:00 · 13663 次点击
    这是一个创建于 2205 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2018-03-16 14:13:55 +08:00
    smileawei
        1
    smileawei  
       2018-03-16 10:05:02 +08:00 via iPhone
    rerun 307 即可。
    kuoruan
        2
    kuoruan  
       2018-03-16 10:05:27 +08:00
    小白我一般都是分开 80 和 443 写配置

    ```
    {
    listen 80;
    server_name *.****;
    location / {
    return 301 https://*.***$request_uri;
    }
    }
    smileawei
        3
    smileawei  
       2018-03-16 10:06:11 +08:00 via iPhone
    return 307 就不会改变请求方式。
    aaronchou0
        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;

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

    307:对于 POST 请求,表示请求还没有被处理,客户端应该向 Location 里的 URI 重新发起 POST 请求
    gclove
        12
    gclove  
       2018-03-16 14:13:55 +08:00
    一般如果旧系统是 http 要转 https 都要使用 307 重定向
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5255 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:15 · PVG 17:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.