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 请求将以此方式进入)。