NGINX代理\通过重写资产uri

NGINX代理\通过重写资产uri,nginx,url-rewriting,subdomain,reverse-proxy,Nginx,Url Rewriting,Subdomain,Reverse Proxy,我正试图通过subdomian做一个基本的NGINX反向代理,到localhost/folder,我很难让它重写我的资产+链接 我的工作方式很有魅力,但通过NGINX+子域,它在子文件夹资产上失败 我相信我被NGINX的“重写”条款难住了 如何重写进入客户端浏览器的HTML以删除/myapp/context server { listen 443 ssl; server_name app1.domain.com; location / { r

我正试图通过subdomian做一个基本的NGINX反向代理,到localhost/folder,我很难让它重写我的资产+链接

我的工作方式很有魅力,但通过NGINX+子域,它在子文件夹资产上失败

我相信我被NGINX的“重写”条款难住了

如何重写进入客户端浏览器的HTML以删除/myapp/context

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(via),以便在请求资产时可以找到它们,而不是404。它应该是(如果我手动去那里,它们就会工作)


--谢谢。

作为nginx
代理通行证
文档:

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

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

在这种情况下,将忽略指令中指定的URI,并将完全更改的请求URI传递给服务器

因此,在您将
/myapp/assets/some_asset
URI重写为
/assets/some_asset
并使用
中断
标志后,使用此配置块,nginx将忽略
/myapp/
代理传递指令上的
/assets/some_asset
后缀,并将
/asset>请求传递到后端。无论多么奇怪,您需要的是使用以下重写规则:

rewrite ^(/myapp/.*)$ $1 break;
另一个(可能更好)的解决方案是使用两个
位置
块:

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

根据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/;
    }
}

此简介修复了我的资产[[[rewrite^(/myapp/*)$$1 break;]]]],但没有重写客户端以隐藏子文件夹/上下文。谢谢它修复了“最”恼人的一点。现在我只需要知道如何让它隐藏所有的/MyAPP/Link,只考虑它是子域的根。理想情况下,tnis也会解决之前的资产问题。如果/login实际上是/login而不是/myapp/login(例如),那么这是一项复杂得多的任务。如果你不能让你的应用程序只生成相对链接(这可能是不可能的),唯一的方法就是动态更改你的后端响应,用新链接重写所有生成的链接。有一个可以做到这一点,但它不是默认构建的,因此为了使用它,您必须从源代码手动构建nginx。使用
nginx-V
命令检查您的nginx构建参数。如果存在一个字符串
——其中包含-http\u sub\u模块
,则可以使用此模块,而无需重新编译nginx。我可能会返回到以前的设置。我的后端是Tomcat,以前我的所有子域都有虚拟服务器。这很好,每个“应用程序”都作为自己的根运行。我真的不喜欢相对链接,因为分享头尾代码肯定会有困难。但我对Tomcats上周的处理感到失望,因为它开始在我所有其他应用程序库中部署我的所有应用程序。超级讨厌。但是允许Tomcat查看完整的域请求工作得很好。我希望用NGIX简化它,在Tomcat.BTW使用通用的子应用程序,如果你继续使用NGiNX,考虑直接用NGIX服务静态文件,而不将额外的请求传递给你的后端,这会更有效。
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/;
    }
}