14

我对 nginx 1.4.1 使用以下配置:

服务器 {
    听8000;
    server_name 正确的.name.gr;

    位置/测试/注册{
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1;
    }
}

我想要做的是当用户访问时,http://correct.name.gr:8000/test/register/他们应该被代理到在端口 80 上运行的 apache。

当我访问时,http://correct.name.gr:8000/test/register/我得到了正确的结果(index.php)。当我访问时,http://correct.name.gr:8000/test/register/asd我得到了正确的结果(来自 apache 的 404)。当我访问时,http://correct.name.gr:8000/test/asd我得到了正确的结果(来自 nginx 的 404)。当我访问时,http://correct.name.gr:8000/test/register123我得到了正确的结果(来自 apache 的 404)。

问题是当我访问http://correct.name.gr:8000/test/register. 我收到 301 响应并被重定向到http://localhost/test/register/(注意尾部斜杠,当然还有 'localhost')!!!

我没有对 nginx 进行任何其他配置来放置斜杠或类似的东西。你知道是什么问题吗?我想http://correct.name.gr:8000/test/register通过代理到 apache 来正常工作(或者如果不可能,至少发出 404 错误而不是重定向到用户的本地主机)。

更新 1:我从另一台计算机上尝试http://correct.name.gr:8000/test/register,而不是我昨天有不良行为的那台计算机。好吧,它奏效了:我刚收到一个 301 响应,指出我是正确的http://correct.name.gr:8000/test/register/!如何在一台计算机上工作而不是在另一台计算机上工作(我在两台计算机上使用相同的浏览器-Chrome)?我明天再试一次,从第三个开始测试,看看行为。

谢谢 !

4

2 回答 2

3

我的猜测是您的上游服务器(apache 或您的脚本)触发了对绝对url的重定向http://localhost/test/register/。因为您http://127.0.0.1proxy_pass指令中使用,所以 nginx 找不到匹配的域名并按Location原样返回标头。

我认为正确的解决方案是如果重定向到内部 url,则不要使用绝对重定向。这始终是一个好习惯。

但是,在不更改上游服务器的情况下,有两种快速解决方案。

您可以使用

proxy_pass http://localhost;

这将告诉 nginx 上游的域名是localhost. 然后,当 nginx从上游找到标头中的该部分时,它将知道替换http://localhost为。http://correct.name.gr:8000Location

另一种是添加proxy_redirect一行以强制 nginx 重写其中包含的任何位置标头http://localhost/

 proxy_pass http://127.0.0.1;
 proxy_redirect http://localhost/ /;

我更喜欢第一个解决方案,因为它更简单。使用没有 DNS 查找开销,proxy_pass http://localhost;因为 nginx 在启动 Web 服务器时会提前进行查找。

参考: http: //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

于 2013-07-04T03:47:11.053 回答
1

您是否已经尝试过使用server_name_in_redirect

但是,我通过 google 发现了你的问题,因为我在结尾的斜杠上遇到了同样的问题。Nginx 强制 301 到带有尾部斜杠的相同 URL。

于 2013-07-03T20:47:25.120 回答