使用 Nginx 如何将单个 URI 从 http 重定向到 https?

使用 Nginx 如何将单个 URI 从 http 重定向到 https?

Web 应用程序的大多数交易都是自行保护的,但在浏览器中进行交易时不会显示锁定图标。目标是让某些页面(如登录页面)进行 SSL 加密并在浏览器中显示锁定图标。例如http://www.domain.com/pro应该是 https,但是如果你去了http://www.domain.com它将通过 http 进入。我们有几个 URI 需要重定向。

我的第一次尝试是尝试重写:

rewrite ^/pro$ https://www.domain.com/pro

但这显然会导致重定向循环,所以我尝试包含 http 部分。

rewrite ^http:*./pro$ https://www.domain.com/pro

这也不起作用,并导致重定向循环。我唯一的猜测是,重写中的正则表达式不查看标头,只查看 URI 本身,因此它会以 www 开头,而不是 http。

我尝试了一些使用位置而不是重写的方法,但这就是我遇到的问题。

location /pro {
    if ( $scheme = http ){
        rewrite ^ https://www.domain.com/pro;
    }
}

在配置中使用此方法,重写会发生,但我从 nginx 收到 404 Not Found 页面。如果我删除它,但输入https://www.domain.com/pro然后就可以正常加载了。我觉得 location 语句再次捕获了 URI,但由于 if 语句不再为真,所以不知道该如何处理它。我只是不确定在 location 块中还要包含什么才能使其正常工作。

那么我如何才能让某些页面从 http 连接切换到 https 连接呢?

答案1

HTTPS 和普通 HTTP 将通过不同的端口进入,因此您真正要做的只是将您希望通过 HTTPS 提供的任何普通 HTTP 请求重定向到 HTTPS。因此,如下所示:

server {
  listen                      80;
  server_name                 _;

  location / {
    rewrite ^/(pro)$ https://$host/$1;
  }
}

... 不应导致重定向循环,因为它仅在:80 上转发,并且转发到:443(默认情况下,HTTPS 请求将以此方式进入)。

相关内容