为什么即使请求不安全,nginx $scheme 和 $https 也总是“安全的”?

为什么即使请求不安全,nginx $scheme 和 $https 也总是“安全的”?

我正在尝试为处理 HTTPS 重定向的应用程序设置反向代理(即,如果它注意到协议不是 HTTPS,它会将用户重定向到安全站点):

server {
    listen 80 default_server;
    listen 443 ssl;
    location / {
        proxy_pass http://localhost:8080;
        proxy_redirect default;
        proxy_redirect https://$proxy_host/ https://$host/;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

上游服务器需要知道原始请求是否通过 https,它应该通过 X-Forwarded-Proto 标头知道,假设$scheme80 上是“http”,443 上是“https”。

然而,对于同时向 443端口 80 已$scheme设置为“https”并$https设置为“on”总是— 也就是说,即使连接不安全,这些变量也总是显示连接是安全的?这些变量是否基于服务器配置而不是实际传入请求进行“硬编码”?

答案1

我的错。nginx设置$scheme(并且大概$https),正如我所期望的那样,根据请求。

问题出在以下 node.js 代码:

var proto = req.headers['x-forwarded-proto'] || (req.connection.encrypted) ? 'https' : 'http';

看起来正确,但运算符优先级实际上是错误的!应该是这样的:

var proto = req.headers['x-forwarded-proto'] || ((req.connection.encrypted) ? 'https' : 'http');

如果不进行修复,无论何时req.headers['x-forwarded-proto']出现,proto即使来自 nginx 的标头是正确的,我的本地都会设置为“https”!

相关内容