nginx-将特定页面路径重定向到 https,同时将其他所有内容保留在 http 上(在单个服务器调用中)?

nginx-将特定页面路径重定向到 https,同时将其他所有内容保留在 http 上(在单个服务器调用中)?

从我目前收集到的信息来看,显然应该不惜一切代价避免在 nginx 中运行 if 语句。到目前为止,我发现的有关特定页面重定向的大多数示例都涉及使用多台服务器。但是,这不是有点浪费吗?我不确定,但我认为在负载很重的情况下,使用多台服务器来完成此任务会比使用单台服务器慢一些。

我当前的服务器调用是这样的:

server {
    listen  10.0.0.60:80;
    listen  10.0.0.60:443 default ssl;

    #other code
}

我想要做的是将某些 http 请求重定向到 https 请求。例如,我希望 /login/ 和 /my-account/ 始终强制使用 SSL。但是,如果您在 /help/ 上,我希望通过默认 http 提供服务。

有没有办法在一次服务器调用中完成此操作?或者使用 2 次服务器调用来实现此目的没有任何缺点?nginx 似乎处于非常活跃的开发阶段,我所遵循的许多旧指南都是在您无法在同一服务器调用中监听端口 80 和 443 的请求时编写的。但现在 nginx 已更新以支持这一点(我正在运行 1.2.4),我想知道今天是否有一种“最佳实践”方法来处理这个问题。

任何帮助将不胜感激。

编辑:

我确实找到了这个指南: 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 时,所有内容都会重定向到 SSL,因此它确实可以工作。但是 /#/user/login 的重定向不会重定向到 HTTPS。有什么想法吗?另外,这是解决这个问题的好方法吗?

答案1

如果使用正确,IF 是没问题的。对于你的情况,你可以尝试这样的配置块(未经测试):

location /login {
   if ($scheme != 'https') { 
       return 301 https://$host$url;
    }
 }

答案2

事实证明,由于 URL 中的井号标签 #,我无法重定向此页面。由于井号标签仅在客户端浏览器端更新,因此服务器看不到该 URL。我原来的重定向代码和 Andrei 的代码(我对 $uri 进行了修改)命令也正常工作。

答案3

如果/login在位置块中使用对您有用,那么更改地图条目以删除类似于此的哈希~/login "https";也应该有效。

$uri位置块直接与您使用的地图相关。在位置块中起作用的匹配$uri也应该在映射中起作用。

而且 - 正如您所意识到的 - 您需要匹配客户端从服务器请求的路径,而不一定与客户端在位置栏中显示的路径相同。

附言——我在原始问题中写了你链接的指南。

相关内容