You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGINX重写后静态Web资源无法访问问题求助

解决Spring服务通过Nginx反向代理后静态资源加载失败的问题

你的问题核心在于:Spring应用默认生成的静态资源路径基于根路径(/),但通过Nginx的子路径(/operate/、/tasklist/)访问时,浏览器会直接向根路径请求静态资源,而原Nginx配置没有对应规则处理这些请求,导致资源加载失败。同时原配置的rewrite会剥离请求前缀,Spring无法感知自己运行在子路径下,生成的资源路径自然不会带上前缀。

下面提供两种可行的解决方案:

方案一:修改Spring应用上下文路径(推荐)

给两个Spring服务分别设置上下文路径,让它们自动生成带前缀的静态资源URL:

  • 对于operate服务,在application.properties或application.yml中添加:
    server.servlet.context-path=/operate
    
  • 对于tasklist服务,添加:
    server.servlet.context-path=/tasklist
    

修改后的Nginx配置(去掉冗余的rewrite规则):

server{
    listen 445;
    listen [::]:445;

    location /operate/ {
        proxy_pass http://127.0.0.1:8081/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /tasklist/ {
        proxy_pass http://127.0.0.1:8082/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

方案二:使用Nginx的sub_filter替换资源路径(无需修改Spring配置)

如果不想调整Spring应用配置,可以用Nginx的ngx_http_sub_module模块(需确保Nginx编译时包含该模块),自动替换页面中的根路径为对应子前缀:

server{
    listen 445;
    listen [::]:445;

    location /operate/ {
        rewrite ^/operate/(.*)$ /$1 break;
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 替换页面中所有根路径开头的资源引用
        sub_filter 'href="/' 'href="/operate/';
        sub_filter 'src="/' 'src="/operate/';
        sub_filter_once off; # 替换所有匹配项,而非仅第一个
    }

    location /tasklist/ {
        rewrite ^/tasklist/(.*)$ /$1 break;
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        sub_filter 'href="/' 'href="/tasklist/';
        sub_filter 'src="/' 'src="/tasklist/';
        sub_filter_once off;
    }
}

验证步骤

修改Nginx配置后,执行以下命令重启Nginx:

nginx -s reload

访问http://[主机IP]:445/operate/和http://[主机IP]:445/tasklist/,查看浏览器控制台,确认静态资源请求路径已变为/operate/xxx.css或/tasklist/xxx.js的形式,且能正常加载。

内容的提问来源于stack exchange,提问作者Oussama Abouzid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:47:48