当前位置: 首页 > 知识库问答 >
问题:

nginx和带代理传递的尾随斜杠

薛欣德
2023-03-14
server {
    listen       8000;
    server_name  correct.name.gr;

    location /test/register {
        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时,我会得到正确的结果(404来自apache)。当我访问http://correct.name.gr:8000/test/asd时,我会得到正确的结果(404来自nginx)。当我访问http://correct.name.gr:8000/test/register123时,我会得到正确的结果(404来自apache)。

问题是当我访问http://correct.name.gr:8000/test/register时。我得到一个301响应,并被重定向http://localhost/test/register/(注意后面的斜杠,当然还有'localhost')!!!

更新1:我从另一台计算机尝试了http://correct.name.gr:8000/test/register,而不是昨天发生不良行为的计算机。好了,它奏效了:我刚刚得到了一个301响应,它指向了正确的http://correct.name.gr:8000/test/register/!怎么可能在一台电脑上工作而不在另一台电脑上工作(我在两台电脑上使用相同的浏览器-Chrome)?我明天再试一次,从第三个测试,看看行为。

谢谢!

共有1个答案

段干昊然
2023-03-14

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

我认为正确的解决方案是不要使用绝对重定向,如果重定向是一个内部URL。这总是一个很好的做法。

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

proxy_pass http://localhost;

另一个方法是添加proxy_redirect行,以强制nginx重写任何位置标头,标头中包含http://localhost/

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

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

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

 类似资料:
  • 我的a域是在CloudFlare的免费工具后面管理的。我想添加一个名为“test”的子域,但我希望它指向在我的服务器端口8183上运行的第二个webserver。在Cloudflare DNS portal中,我有一个“test.example.com”的A记录,它指向我的WebServer的IP地址,该地址也被代理以隐藏我的WebServer的实际IP地址。所有流量都通过HTTPS路由,证书也由

  • 问题内容: 我的nginx服务器实际上是使用以下简单的代理来代理节点后端(侦听端口3000): 其中上游_1是我在nginx.conf中定义的节点群集(在端口3000上)。 我将不得不通过http连接添加SSL,所以我有以下问题:我是否只需要配置nginx来启用ssl?并且它将自动“解密”请求并将未解密的请求传递给能够正常处理的Node?还是我需要将Nodejs配置为也支持ssl? 问题答案: 如

  • 我正在阅读Flask quickstart指南,但是使用变量进行路由的示例对我来说并不适用。 http://127.0.0.1:5000/user/bob重定向到http://127.0.0.1:5000/user/bob/给我一个404 我还尝试了与指南中完全相同的代码。我的第一个要点中的错误是意料之中的吗?快速入门版本中的代码应该工作吗?还是我误解了什么? 我使用的是Python 2.7.10

  • 我不确定这是否可以实现。我正在使用以下版本以群集模式运行docker: 客户端:版本:17.03.0-CE API版本:1.26Go版本:GO1.7.5 Git提交:3A232C8构建:周二2月28日08:10:07 2017 OS/arch:linux/amd64 显然,客户端套接字连接无法解析到群集中托管的服务集群。docker swarm是否有一个变通配置,或者它只是不可能?我没有太多的运气

  • 我正在尝试使用nginx代理传递到使用基本身份验证的Kibanapod。 用于测试(这是另一个k8s集群,但非常相似,使用相同的命名空间,kube dns,POD内的env匹配,并且它们彼此看到)上下文:我通过AWS中k8s的helm部署了这个,nginx有一个Kubernetes LB服务类型(基本上是AWS的ELB,其cname位于route53)。 如果我将nginx pod指向kibana

  • 我有一个Spring控制器,其中有几个用于不同URI的RequestMapping。我的servlet是“UI”。servlet的基本URI只使用尾随斜杠。我希望我的用户不必输入尾随斜杠。 此URI的工作方式是: