您的位置 首页 nginx

nginx强制http转https时,POST请求http失败

 

 

测试通过:

        location / {
          proxy_pass http://7.3.1.46:22;
          proxy_set_header Host $host;
	  proxy_set_header X-Real-Ip $remote_addr;
	  proxy_set_header X-Forwarded-For $remote_addr;
          
          #default_type text/plain;
          if ($request_uri ~* "^/SmartHome/v3/(.*)$") {
             #return 200 $host=/v3/$1;
             return 307 /v3/$1;
           }

} 

 

 

利用nginx将http强制转为https时,网传有三种方法

1.rewrite:

rewrite ^(.*)$  https://$host$1 permanent;

2.return:

return 301 https://$server_name$request_uri;

3.error_page(未测试):

error_page 497  https://$host$uri?$args;

第一种rewrite方法比较常见,我开始用的也是这个,配置修改后重启nginx,发现http访问确实跳转到了https,但是后台报错,报错信息是:不支持GET请求。明明用的是POST请求,却在转发后改变了。

解决办法
使用return,且状态码改为307:

return 307 https://$server_name$request_uri;

原因

rewrite 最后一项flag参数为permanent时,返回301永久重定向,POST请求中的用户信息不会被保存,转而直接采用GET请求访问新地址。相似的302是临时重定向,POST请求也会失败,但比前者多了一步中间信息返回给客户端的步骤。

307也是临时重定向,但它可以保持原请求的方法,不做修改的访问新地址。POST请求自然不会有问题。

总结
在没有POST请求的情况,使用301,省去中间返回信息的步骤,更安全。有POST请求使用307.

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章