从我到目前为止所收集的内容来看,清楚的是,如果在nginx中运行if语句应该不惜一切代价来避免。 到目前为止,我发现的关于特定页面redirect的大多数示例都涉及多个正在使用的服务器。 但是,这不是有点浪费吗? 我不确定,但是我认为在负载很重的情况下,多台服务器来完成这个要比单台服务器慢一些。
我目前的服务器调用是这样的:
server { listen 10.0.0.60:80; listen 10.0.0.60:443 default ssl; #other code }
我想要做的是将某些http请求redirect到https请求。 例如,我希望/ login /和/ my-account /始终被迫使用SSL。 如果你在/帮助/虽然,我想通过默认的http服务。
有一种方法可以在单个服务器调用中完成此操作吗? 或者是否有没有缺点使用2服务器调用来实现这个工作? nginx似乎处于非常活跃的开发之中,而我所遵循的很多老版本的指南都是在你不能在同一个服务器调用中监听端口80和443的请求的时候发生的。 但是,现在nginx已经更新,以支持(我正在运行1.2.4),我想知道是否有一个“最佳做法”的方式来处理今天。
任何帮助将不胜感激。
编辑:
我find了这个指南: http : //redant.com.au/blog/manage-ssl-redirection-in-nginx-using-maps-and-save-the-universe/
我更新了我的代码,如下所示:
map $uri $my_preferred_proto { default "http"; ~^/#/user/login "https"; } server { listen 10.0.0.60:80; ## listen for ipv4; this line is default and implied listen 10.0.0.60:443 default ssl; if ($my_preferred_proto = "none") { set $my_preferred_proto $scheme; } if ($my_preferred_proto != $scheme) { return 301 $my_preferred_proto://mysite.com$request_uri; }
这不是工作。 当我将默认值改为https时,所有内容都被redirect到了SSL,所以它有点作用。 但/#/ user / login的redirect不会redirect到HTTPS。 有任何想法吗? 另外,这是一个很好的方式去做这个?
如果使用正确,IFs可以。 在你的情况下,你可以尝试像这样的configuration块(未testing):
location /login { if ($scheme != 'https') { return 301 https://$host$url; } }
事实certificate,由于URL中的哈希标记#,我无法redirect此页面。 由于哈希标签只在客户端浏览器端更新,因此服务器无法看到该URL。 我原来的redirect代码和安德烈的代码(与我修改$ uri)命令也工作正常。
如果在位置块中使用/login ,则更改映射条目以删除类似于~/login "https";的哈希值~/login "https"; 应该也能工作。
位置块直接与您使用的$uri地图相关联。 匹配在一个位置块的作品也应该在$uri映射中工作。
另外 – 正如你所意识到的 – 你需要匹配客户端从服务器请求的path,而不一定与客户端在地址栏中显示的path相同。
ps – 我在原始问题中编写了你正在链接的指南。