我注意到 nginx 默认启用了一项功能,即对于文件系统中存在的目录,如果 URL 请求结尾没有斜杠,则会通过301
重定向自动添加斜杠。
例如,如果目录css
存在于我的根目录中,那么请求http://example.com/css
将导致 301 http://example.com/css/
。
但是,我还有另一个站点,其中 SSL 由负载均衡器卸载。在这种情况下,当我请求 时https://example.com/css
,nginx 会发出 301 重定向到http://example.com/css/
,尽管负载均衡器将HTTP_X_FORWARDED_PROTO
标头设置为。https
这是 nginx 错误吗?还是我遗漏了某个配置设置?
答案1
Nginx 不会查找 HTTP_X_FORWARDED_PROTO,这不是错误。只是缺少这样的功能。
你应该配置你的前端调整响应中的位置标头或者用另一个 nginx 替换它(因为 nginx 本身是一个很好的负载均衡器和 SSL 终止器)。
答案2
看起来 LB 正在执行 SSL 终止,而 nginx 只是收到 HTTP 请求。Nginx 不会修改它收到的任何 HTTP 标头。您可以使用重写规则来执行此操作,该规则检查是否设置了 HTTP_X_FORWARDED_PROTO,然后相应地重写请求。仅供参考,nginx 不支持嵌套或复杂的“if”语句,因此您必须求助于下面链接中描述的方法。
http://rosslawley.co.uk/2010/01/nginx-how-to-multiple-if-statements/