当 SSL 由负载均衡器处理时,如何让 nginx 向 HTTPS 位置发出 301 请求?

当 SSL 由负载均衡器处理时,如何让 nginx 向 HTTPS 位置发出 301 请求?

我注意到 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/

相关内容