我习惯使用带有mod_proxy_html的Apache,并尝试使用NGINX实现类似的功能。具体的用例是我在根上下文服务器上的端口8080上运行Tomcat中的管理UI:
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中执行此操作?
答案 0 :(得分:87)
我们应该先仔细阅读the documentation on proxy_pass。
传递给上游服务器的URI是根据“proxy_pass”指令是否与URI一起使用来确定的。 proxy_pass指令中的尾部斜杠表示URI存在且等于/
。斜杠的缺席意味着没有帽子URI。
带URI的Proxy_pass :
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/
会被/
取代,以将请求路径从/some_dir/some_subdir/some_file
更改为/some_subdir/some_file
。
没有URI的Proxy_pass :
location /some_dir/ {
proxy_pass http://some_server;
}
使用第二个(没有斜杠):代理如下:
http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file
基本上,完整的原始请求路径无需更改即可传递。
所以,在你的情况下,似乎你应该删除尾随斜杠以获得你想要的东西。
<强>买者强>
请注意,只有在proxy_pass中不使用变量时,自动重写才有效。如果你使用变量,你应该自己重写:
location /some_dir/ {
rewrite /some_dir/(.*) /$1 break;
proxy_pass $upstream_server;
}
还有其他情况下重写不起作用,这就是阅读文档必须的原因。
再次阅读你的问题,似乎我可能错过了你只想编辑html输出。
为此,您可以使用sub_filter指令。有点像...
location /admin/ {
proxy_pass http://localhost:8080/;
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}
基本上,您要替换的字符串和替换字符串
答案 1 :(得分:13)
对于具有数据压缩的后端服务器,您可能还需要在第一个“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;
}
答案 2 :(得分:0)
您可以使用以下nginx配置示例:
upstream adminhost {
server adminhostname:8080;
}
server {
listen 80;
location ~ ^/admin/(.*)$ {
proxy_pass http://adminhost/$1$is_args$args;
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;
proxy_set_header X-Forwarded-Host $server_name;
}
答案 3 :(得分:0)
如果没有需要用sub_filter重写的超链接,
您可能只使用 proxy_redirect
指令:
location /admin/ {
proxy_pass http://localhost:8080/;
proxy_redirect / /admin/
}
它根据给定的“匹配重写”规则更改响应的 Location-Header。