我有一个 Nginx 服务器监听在 Docker 容器内运行的
80
。
在 Nginx 配置中,我需要在特定情况下执行到静态页面的重定向。
rewrite ^ /foobar.html redirect;
用户可以使用 docker 命令行运行指定任何端口的容器(作为参考,她可以在端口
8000
上公开容器,并且 Nginx 内部仍将使用 80
)。
现在,当 Nginx 重定向 URL 时,端口会替换为 Nginx 内部使用的端口,而不是使用 Docker 使用的端口。
我尝试设置一堆标题,但没有帮助:
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://app_server;
rewrite ^ /foobar.html redirect;
它仍然重定向到
80
。
如何告诉 Nginx 保留用户使用的端口?
所以,我找到了一个解决方案,我可以指定重定向,如下所示:
rewrite ^ $scheme://$http_host/foobar.html redirect;
这将保留港口。
我通过更新 nginx.conf 文件中定义的标头中的主机定义,解决了 docker 内部重定向中断的相同问题:
location / {
proxy_set_header Host $http_host;
$http_host 是 $host 的小写值,包含端口。
就我而言,在我正确设置
port_in_redirect on;
之前,浏览器已缓存重定向 URL。所以在调试 nginx 规则时禁用浏览器缓存。