繁体   English   中英

NGINX proxy_pass重写资产uri

[英]NGINX proxy_pass rewrite asset uri

我正在尝试通过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/;
    }
}

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

- 谢谢。

从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/;
    }
}

如nginx proxy_pass文档所述

在某些情况下,无法确定请求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会忽略proxy_pass指令上的/myapp/后缀,并将/assets/some_asset请求传递到后端。 不管它多么奇怪,您需要使用以下重写规则:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM