我正在尝试为处理 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 标头知道,假设$scheme
80 上是“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”!