我在configurationnginx时遇到了问题,我已经在网上search了解决scheme,而且我还有一些零碎的东西,但是我仍然无法提出正确的configuration。
我已经注册了一个域,比如说 – www.example.com。 我已经在注册商网站上configuration了所有的东西,ping www.example.com和www。*。example.com成功。
我的机器上运行Apache Tomcat侦听端口8080.我想设置dynamicproxy_pass。 所以如果我的应用程序MyApp运行在tomcat中,并且可以通过localhost:8080 / MyApp访问,我希望能够通过www.MyApp.example.com访问它,所以基本上这个子域名就是tomcat中的应用程序名称。
这是我的nginxconfiguration:
server { server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$; listen 80; location / { proxy_pass http://localhost:8080/$sub_domain/; } }
当我到www.myapp.example.com时,我被redirect到http://localhost:8080/myapp – 我的意思是在我的浏览器中直接inputhttp://localhost:8080/myapp 。
但是,如果我将nginx安装程序中的正则expression式更改为:
server { server_name www.myapp.example.com myapp.example.com listen 80; location / { proxy_pass http://localhost:8080/myapp/; } }
那么一切都像一个魅力。 我知道它必须做一些解决scheme,我已经尝试将parsing器放在nginx中,但它没有任何改变。
我在这里错过了什么?
//编辑:
这是我的configuration。 我仍然被redirect到www.myapp.example.com/myapp/login而不是www.myapp.example.com/login。 我改变了正则expression式,仍然是一样的。
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; } }
curl:
* 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
编辑://
非常感谢Xavier! 添加以下两行帮助:
proxy_pass http://backend/prefix-$domain$request_uri; proxy_redirect http://$host/prefix-$domain http://$host;
2更多的问题,但:
再次,非常感谢! 我花了一个星期的时间来解决这个问题!
在proxy_pass指令中使用variables时,nginx将使用运行时parsing,除非:
在这里,运行时parsing程序将无法帮助,因为localhost可能不会被DNSparsing。 另外,运行时parsing也是一件很浪费的事,因为在这里你可以清楚地避免它。
那么,两个简单的解决scheme
127.0.0.1 现在你需要你的代理服务器redirect是正确的。 所以:
你的代理目标处理主机头,你把它传递给:
proxy_set_header "Host" $host;
你的代理目标不能处理redirect的主机头,你需要使用nginx重写它们:
proxy_redirect http://$proxy_host/$sub_domain http://$host;
但是,如果它根本不支持主机头,链接将被打破。