测试通过:
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.