如何设置 Nginx 以在单个站点上对不同的 URL 使用 ssl/非 ssl,但如果用户在浏览器的地址栏中明确输入 https,则始终使用 ssl?

如何设置 Nginx 以在单个站点上对不同的 URL 使用 ssl/非 ssl,但如果用户在浏览器的地址栏中明确输入 https,则始终使用 ssl?

我现在的nginx.conf样子是这样的:

server {
    listen      80;
    server_name www.example.com;

    root /var/www/;
    location / {
    }
    location /users {
        rewrite ^ https://$http_host$request_uri? permanent;
    }
}

server {
    listen      443 ssl;
    server_name www.example.com;

    root /var/www/;
    location /users {
    }
    location / {
        rewrite ^ http://$http_host$request_uri? permanent;
    }
}

使用此配置,当用户浏览网站上的页面时,连接将从 ssl/非 ssl 切换,以 开头的 URL 使用 ssl,/users而其他所有 URL 使用非 ssl。因此,即使用户明确https://www.example.com/在浏览器的地址栏中输入,结果页面也会重定向到http://www.example.com/

有没有办法实现上述设置中 ssl/non-ssl 之间的自动 url 重写,但如果https://用户在浏览器的地址栏中明确输入,仍然尊重明确的 ssl 请求?

答案1

从服务器的角度来看,没有办法区分通过点击链接、抓取网站或在位置栏中输入完整地址所发出的请求。

当您输入地址时,Web 浏览器会向您的 Web 服务器发送 HTTP 请求。如果您输入 https,它将尝试连接到端口 443(默认情况下),并且请求标头不会保存用户输入请求或请求或机器人抓取请求的信息。

您所能做的就是为某些用户代理保留 SSL,并为其他用户代理重定向。

相关内容