本来在nginx中写了一个访问80端口,重写到443的规则之前一直都没有问题,昨天帮同事做内网穿透后服务器端nginx做反向代理,里面的重写规则也是用rewrite写的,结果发现http请求重写https后post请求参数丢失,而且post请求变get这就很奇怪了,搜了一下发现不止我一个人有这样的问题,换成proxy_pass或者 return 307可以解决


原重写规则

server {
        listen 80;
        server_name www.baidu.com;
        rewrite ^/(.*)$ https://www.baidu.com:443/$1 permanent;    
}

这样确实可以让http请求跳转到https,但是nginx会重写请求成http 301,post变get请求,而且参数都丢失,所以我的解决办法是通过http请求通过return 307到https

server {
        listen 80;
        server_name www.baidu.com;       
        return 307 https://$server_name$request_uri;
}

修改规则以后问题解决,嘿嘿