Nginx反向代理IIS应用时资源请求路径错误如何修复?
问题修复方案
你的问题核心是IIS应用返回的资源路径是绝对根路径(如/css/main.css),浏览器会直接请求域名根路径而非/app_1/前缀下的路径,导致静态资源、接口请求404或加载失败。以下是几种可行的修复方案:
方案一:通过Nginx的sub_filter重写响应内容
适合无法修改IIS应用代码的场景,让Nginx自动把应用返回的根路径替换为带/app_1/前缀的路径:
修改Nginx的location /app_1/块,添加以下配置:
location /app_1/ { proxy_pass http://app_1/; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_set_header X-REAL-SCHEME $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # 开启sub_filter功能 sub_filter_types text/html text/css text/javascript application/json; # 将响应中的根路径/替换为/app_1/ sub_filter '/' '/app_1/'; sub_filter_once off; access_log /etc/nginx/log/access.log; error_log /etc/nginx/log/error.log; }
sub_filter_types指定要处理的响应内容类型,可按需添加;sub_filter_once off确保替换所有匹配的路径,而非仅第一个。
方案二:修改IIS应用的基础路径
如果有权限修改应用配置,这是最彻底的方案:
- 设置虚拟目录:在IIS中将该应用的虚拟目录路径设为
/app_1,应用生成的所有路径会自动带上/app_1前缀; - 配置base href:在应用HTML入口文件(如
index.html)的<head>中添加<base href="/app_1/">,强制页面内所有相对路径都基于该前缀生成。
方案三:调整Nginx路径映射(需配合应用适配,不优先推荐)
若不想修改响应内容,可调整proxy_pass和rewrite规则,但要求应用能识别不带前缀的路径:
location /app_1/ { rewrite ^/app_1/(.*)$ /$1 break; proxy_pass http://app_1; # 其余proxy_set_header配置保持不变... }
该方案会将/app_1/uri重写为/uri后转发给后端应用,但静态资源请求仍可能存在浏览器请求根路径的问题,因此一般优先选择前两种方案。
内容的提问来源于stack exchange,提问作者zgr
相关产品推荐
相关产品推荐

