如何在NGINX

时间:2015-09-12 18:30:42

标签: nginx

我习惯使用带有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中执行此操作?

4 个答案:

答案 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。