如何在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; }