如何在NGINX中的代理响应中重写URL

我习惯于使用mod_proxy_html来使用Apache,并试图用NGINX实现类似的function。 具体的用例是我有一个pipe理用户界面在服务器端口上的端口8080上运行在Tomcat上:

http://localhost:8080/ 

我需要在端口80上显示这个,但是我在这个主机上运行的NGINX服务器上有其他的上下文,所以想试试这个:

 http://localhost:80/admin/ 

我希望以下超级简单的服务器块会这样做,但它不完全:

 server { listen 80; server_name screenly.local.akana.com; location /admin/ { proxy_pass http://localhost:8080/; } } 

问题是返回的内容(html)包含脚本和样式信息的URL,这些URL都是在根上下文中访问的,所以我需要将这些URL重写为/ admin /而不是/。

我如何在NGINX中做到这一点?

Nginx的“proxy_pass”指令有两个宽泛的设置,取决于尾部的斜线是否存在:

 location /some_dir/ { proxy_pass http://some_server/; } 

要么

 location /some_dir/ { proxy_pass http://some_server; } 

首先, http://your_server/some_dir/some_subdir/some_file将被代理到http://some_server/some_subdir/some_file

基本上, /some_dir/被replace为/将请求path从/some_dir/some_subdir/some_file/some_subdir/some_file

使用第二个(没有结尾的斜杠),相同的请求将被代理到http://some_server/some_dir/some_subdir/some_file

基本上,完整的原始请求path被传递而没有改变。

所以,在你的情况下,似乎你应该放弃斜线来得到你想要的。

编辑

再次读你的问题,似乎我可能错过了你只是想编辑HTML输出。

为此,您可以使用sub_filter指令。 就像是 …

 location /admin/ { proxy_pass http://localhost:8080/; sub_filter "http://your_server/" "http://your_server/admin/"; sub_filter_once off; } 

基本上,你要replace的string和replacestring

您可能还需要在具有数据压缩的后端服务器的第一个“sub_filter”之前设置以下指令:

 proxy_set_header Accept-Encoding ""; 

否则它可能无法正常工作。 对于你的例子,它将如下所示:

 location /admin/ { proxy_pass http://localhost:8080/; proxy_set_header Accept-Encoding ""; sub_filter "http://your_server/" "http://your_server/admin/"; sub_filter_once off; }