Nginx反向代理重写来隐藏应用程序名称

这个问题可能会问很多次,我一直在阅读,但仍然不能得到我想要的。

我有一个应用程序运行在http://172.17.1.10:8080/myapp我想设置nginx反向代理访问应用程序使用http://sub.domain.com只隐藏“myapp”在地址栏中。

我目前的设置是:

 server{ listen 80; server_name sub.domain.com; location /myapp { rewrite ^/myapp(.*) /$1 break; proxy_pass http://172.17.1.10:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; include /etc/nginx/proxy_params; } } 

但是我一直使用http://sub.domain.comhttp://sub.domain.com/myapp查看Nginx的索引页面。 我错过了什么?

当您更改包含proxy_pass指令的位置块内正在处理的URI的内容时,则需要使用proxy_redirect处理Location标头重写:

在某些情况下,无法确定要replace的请求URI部分:

  • 当使用正则expression式指定位置时。 在这种情况下,应该指定指令而不使用URI。

  • 当使用rewrite指令在代理位置内更改URI时,将使用此相同的configuration来处理请求(中断)。

但在你的情况下,没有理由使用重写,因为nginx已经在proxy_pass指令中处理了这个,同时添加了一个URI前缀:

如果proxy_pass指令是用URI指定的,那么当一个请求被传递给服务器时,与该位置相匹配的标准化请求URI的一部分被指令中指定的URIreplace。

此外,您还需要删除proxy_redirect指令,以便nginx可以使用proxy_pass URI前缀作为模式并使用位置前缀作为replace来重写Location标头。

所以简单地使用这个:

 server { server_name sub.domain.com; location / { proxy_pass http://172.17.1.10:8080/myapp/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; include /etc/nginx/proxy_params; } } 

改变这三行应该修复你:

 location /myapp { rewrite ^/myapp(.*) /$1 break; proxy_pass http://172.17.1.10:8080; 

至:

 location / { proxy_pass http://172.17.1.10:8080/myapp;