全站默认跳转 https,但是想使用 http 访问 /wifi.hmtl 这个页面
使用 if 多重判断写的,感觉不够好。还有什么办法吗?
set $wifi 0;
if ($request_uri != "/wifi.html") {
set $wifi "${wifi}1";
}
if ($http_x_forwarded_proto = "http") {
set $wifi "${wifi}1";
}
if ($wifi = "011") {
return 301 https://$host$request_uri;
}
1
isCyan 2017-12-14 16:22:55 +08:00 via Android
搜索 nginx if is evil 了解 if 的坑
用 location 一个 location / return 301 https 另外一个 location = /wifi.html 没有跳转 试试行不行 |
2
trepwq OP @isCyan location / return 301 https 会死循环吧。。。而且我还有其他根的 location
|
3
isCyan 2017-12-14 17:41:44 +08:00 via Android
@trepwq 80 443 两个端口 两个 server block 不要把 http 和 https 放同一个 server
|
4
kiwi95 2017-12-14 17:55:04 +08:00 via iPhone
if is evil in nginx config
|
5
stabc 2017-12-14 18:10:54 +08:00
1L 说的解决方法非常好了
|
6
yingfengi 2017-12-14 18:13:07 +08:00 via Android
3 楼不错
|
7
mooncakejs 2017-12-14 18:14:30 +08:00
@isCyan 求大佬介绍个 前面有负载均衡 proto 放在 http_x_forwarded_proto 怎么避免 if 的方案
|
8
isCyan 2017-12-14 18:55:49 +08:00 via Android
@mooncakejs 我也不知道有什么不用 if 的办法。
如果负载均衡仅仅用 HTTPS 回源,然后带一个客户端请求协议的 proto 变量的话, 用 if 条件判断,但是里面只能用 rewrite 指令。 比如 https://www.nginx.com/blog/creating-nginx-rewrite-rules/ Example – Forcing all Requests to Use SSL/TLS 里面有个 NOT RECOMMENDED 的实例(并不是不能用)。 所以,如果仅仅是想强制使用 HTTPS 的话,你可以在负载均衡服务器设置跳转。这是最佳选择。 或者,HTTP 请求使用 HTTP 回源,HTTPS 请求使用 HTTPS 回源,这样分开。但是如果不是内网的话,HTTP 回源容易被劫持,也要小心。 |
9
mooncakejs 2017-12-15 10:14:49 +08:00 via iPhone
@isCyan 就是内网,不是全站,全站就简单了。
|