domain-name-system – Nginx dynamic proxy_pass无法正确解析

前端之家收集整理的这篇文章主要介绍了domain-name-system – Nginx dynamic proxy_pass无法正确解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在配置Nginx时遇到问题,我在网上搜索解决方案,但我有点点零碎,但我仍然无法提供正确的配置.

我已经注册了一个域名,比方说 – www.example.com.我在注册商网站上配置了所有内容,ping www.example.com和www.*.example.com成功.

我在我的机器上运行Apache Tomcat监听端口8080.我想设置动态proxy_pass.
因此,如果我的应用程序MyApp在tomcat中运行并且可以通过localhost:8080 / MyApp访问,我希望能够通过www.MyApp.example.com访问它,所以基本上子域名将是tomcat中应用程序的名称.

这是我的Nginx配置:

server {
  server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
  listen 80;

  location / {
     proxy_pass http://localhost:8080/$sub_domain/;
  }
}

当我访问www.myapp.example.com时,我被重定向到http:// localhost:8080 / myapp – 我的意思是我最终在我的浏览器中以http:// localhost:8080 / myapp结束.

但是,如果我将Nginx设置中的正则表达式更改为:

server {
      server_name www.myapp.example.com myapp.example.com
      listen 80;

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

然后一切都像一个魅力.我知道它必须对解析器做一些事情,我已经尝试过将解析器放在Nginx中,但它什么都没改变.

我在这里想念的是什么?

//编辑:

这是我的配置.我仍然被重定向到www.myapp.example.com/myapp/login而不是www.myapp.example.com/login.我改变了正则表达式,仍然是一样的.

http {

    upstream backend {

             server 127.0.0.1:8080;

    }

    server {                                                         
          server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
          listen 80;                                                        


           location / {
               proxy_set_header "Host" $host;
               proxy_pass http://backend/prefix-$sub_domain/;

               proxy_redirect http://$host/prefix-$sub_domain/ http://$host;

           }

    }

卷曲:

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /prefix-myapp/ HTTP/1.1
> User-Agent: curl/7.35.0
> Accept: */*
> Host: www.myapp.example.com
>
< HTTP/1.1 302 Found
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=E609EB96D8F27FD6F4E7F9ED9ACA5245; Path=/prefix-myapp/; HttpOnly
< Location: http://www.myapp.example.com/prefix-myapp/login;jsessionid=E609EB96D8F27FD6F4E7F9ED9ACA5245
< Content-Length: 0
< Date: Tue,21 Oct 2014 16:48:05 GMT
<
* Connection #0 to host 127.0.0.1 left intact

编辑://

非常感谢泽维尔!添加以下两行有助于:

proxy_pass http://backend/prefix-$domain$request_uri;
proxy_redirect http://$host/prefix-$domain http://$host;

2但更多问题:

>此配置对性能有很大影响吗?
>我可以过滤掉$request_uri中的内容(例如JSESSIONID = 1233 ….)吗?

再次,非常感谢!我花了一个星期的时间才想出这个!

解决方法

当您在proxy_pass指令中使用变量时,Nginx将使用运行时解析,除非:

>目标服务器被声明为IP地址
>目标服务器名称是上游服务器组的一部分
>目标服务器名称已经解析(例如,它与另一个服务器块中的服务器名称匹配)

此处,运行时解析程序无法提供帮助,因为DNS可能无法解析localhost.运行时解析也是一种浪费,因为你可以在这里清楚地避免它.

那么,两个简单的解决方

>使用127.0.0.1
>如果您有服务器名称或目标服务器池,则声明upstream block

现在您需要代理服务器重定向才是正确的.所以要么:

>您的代理目标处理主机头,并通过以下方式传递:

proxy_set_header“Host”$host;
>您的代理目标无法处理重定向的主机标头,您需要使用以下命令使用Nginx重写它们:

proxy_redirect http:// $proxy_host / $sub_domain http:// $host;

但是,如果它根本不支持Host标头,则链接将被破坏.

猜你在找的HTML相关文章