Nginx 在重定向时丢失端口

Nginx 在重定向时丢失端口

我有一个在 Vagrant 开发环境中运行的 Wordpress 网站。当我加载 时http://localhost:8080,网站可以正常显示,但是当我尝试通过 访问管理员时http://localhost:8080/wp-admin,我被重定向到http://localhost/wp-admin/

这里有两件事:

  1. Nginx 强制使用尾部斜杠(据我所知,我不是故意这样做的,但这样做没问题)。
  2. 在尾随斜杠重定向中,端口丢失(这非常不好)。

我尝试添加port_in_redirect我在其他类似问题的答案中看到的指令(老实说,使用两个值),但它没有任何改变。

知道我错过了什么吗?

答案1

在a 内部proxy_redirect使用a 时的默认值(适应您的用例)是:proxy_passlocation

location / {
  proxy_pass     http://localhost:8080/;
  proxy_redirect http://localhost:8080/ /;
}

由于您在 Vagrant 中使用相同的 8080 端口,因此这将匹配并删除该端口。

有两个简单的解决方案可以避免这种情况:

  1. 转发到 vagrant 配置中的不同端口,这样proxy_redirect就不匹配了。
  2. 禁用proxy_redirect使用proxy_redirect off;

(我知道这是 4 年前的事了,但我在测试 KeyCloak 时遇到了类似的问题,所以我希望这个答案能够帮助其他遇到这个问题的人。)

答案2

在我的情况下,浏览器在我正确设置之前缓存了重定向 URLport_in_redirect on;

语法:port_in_redirect on | off;
默认:
port_in_redirect on;
上下文:http、server、location
启用或禁用在 nginx 发出的绝对重定向中指定端口。
参考:Nginx 手册

因此,在调试 nginx 规则时请禁用浏览器缓存。

答案3

你需要使用代理重定向修改响应头,使 localhost 重写为 localhost:8080

答案4

nginx/1.21.3 似乎不遵循自己的文档当 URI 替换不明确时进行重定向。

遵循配置使我能够使两者/wp-admin正常工作/wp-admin/

server {
    location = /wp-admin {
        rewrite    /wp-admin / break;
        proxy_pass http://172.17.0.1:8000;
    }
    location /wp-admin/ {
        proxy_pass http://172.17.0.1:8000/;
    }
}

P.S.我想为自定义端点后面的服务设置反向代理。我花了几个小时尝试禁用在没有尾部斜杠时丢失端口的静默重定向。我希望这对某些人有帮助。

相关内容