NGINX proxy_pass重写资产uri

时间:2018-12-28 23:48:37

标签: nginx url-rewriting subdomain reverse-proxy

我正在尝试通过subdomian到localhost / folder做一个基本的NGINX反向代理,并且很困惑让它重写我的资产和链接。

我的http://localhost:8080/myapp/就像一个超级按钮,但是通过NGINX +子域,它在子文件夹资产上失败了。

我相信我对NGINX的'rewrite'子句感到困惑。

如何重写去客户端浏览器以删除/ myapp /上下文的HTML?

server {
    listen       443 ssl;
    server_name  app1.domain.com;
    location / {
        rewrite ^/myapp/(.*) /$1 break; # this line seems to do nothing
        proxy_pass http://localhost:8080/myapp/;
    }
}

我希望在不使用子文件夹/ myapp /的情况下重写我生成的HTML(通过https://app1.domain.com),因此,当请求资产时,可以找到它们而不是针对https://app1.domain.com/myapp/assets/的404。它应该只是https://app1.domain.com/assets/(如果我手动去那里,它们会起作用)

-谢谢。

2 个答案:

答案 0 :(得分:1)

从Ivan的反馈中得出并最终确定我的解决方案为:

server {
    listen       443 ssl;
    server_name  app1.domain.com;
    location / {
        sub_filter '/myapp/'  '/'; # rewrites HTML strings to remove context
        sub_filter_once off; # ensures it loops through the whole HTML (required)
        proxy_pass http://localhost:8080/myapp/;
    }
}

答案 1 :(得分:0)

作为nginx proxy_pass文档states

  

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

     

...

     

当使用rewrite指令在代理位置内更改URI时,该相同的配置将用于处理请求(中断):

location /name/ {
    rewrite    /name/([^/]+) /users?name=$1 break;
    proxy_pass http://127.0.0.1;
}
     

在这种情况下,伪指令中指定的URI将被忽略,并将更改后的完整请求URI传递到服务器。

因此,使用此配置块将/myapp/assets/some_asset URI重写为/assets/some_asset并使用break标志后,nginx会忽略/myapp/指令上的proxy_pass后缀,并且将/assets/some_asset请求传递给您的后端。无论多么奇怪,您需要使用以下重写规则:

rewrite ^(/myapp/.*)$ $1 break;

另一种(可能更好)的解决方案是使用两个location块:

location / {
    proxy_pass http://localhost:8080/myapp/;
}
location /myapp/ {
    proxy_pass http://localhost:8080;
}