IIS10 ASP.NET站点随机403致资源加载失败问题排查
IIS 10 随机静态资源403问题排查与解决
首先先排除两个无关的事件日志报错:
- Application Host Helper Service删除
C:\inetpub\history下历史配置目录失败是IIS配置自动备份的清理权限问题,完全不影响站点正常请求响应,和403问题无关。 - 之前记录的ModSecurity报错是组件未配置
SecDataDir数据目录导致的,你已经禁用该组件后不再产生相关日志,这部分也可以排除,不是403的诱因。
核心问题定位
你遇到的强刷时失败资源随机(图片/CSS/字体随机报错)、禁用缓存后问题暴露、所有访问设备可复现的特征,90%以上概率是当前CORS配置导致的,核心问题点在failUnlistedOrigins="true"配置项:
- 同域下加载静态资源时,浏览器不会在所有请求里都携带
Origin请求头:直接刷新页面加载资源、从浏览器历史回跳到页面时,静态资源请求的Origin头大概率为空。你配置了failUnlistedOrigins="true"后,IIS CORS模块会直接拦截所有Origin不在白名单里的请求,包括没有Origin头的合法同域请求,直接返回403。你之前开了本地缓存时大部分资源从本地读,不会发请求到服务器,所以问题被隐藏,加了全局不缓存配置后所有资源都要重新向服务器请求,问题就暴露了。 - 你配置的
https://*.example.com泛域名规则在IIS原生CORS模块里不生效,该模块默认只支持精确Origin匹配,泛域名写法不会被识别为合法白名单源,所有来自子域的带Origin头的请求也会被拦截。
排查验证步骤
- 先做根因验证:临时将CORS配置中的
failUnlistedOrigins="true"改为false,重启对应IIS站点,反复按Ctrl+F5刷新10次以上,如果随机403问题完全消失,即可确认是CORS配置导致的问题。 - 修正CORS配置:
- 保持
failUnlistedOrigins="false",避免无Origin头的合法同域请求被拦截 - 移除配置里的泛域名白名单条目,IIS原生CORS模块不支持泛域名匹配,需要通过URL重写模块或者ASP.NET应用中间件自定义Origin校验逻辑,对匹配
*.example.com的请求手动添加Access-Control-Allow-Origin等CORS响应头
- 保持
- 调整缓存策略:不要给全站所有资源(包括静态资源)加
no-store响应头。图片、CSS、字体这类静态资源可以单独配置缓存规则,要么用带文件hash的文件名做长缓存,要么单独设置no-cache(走协商缓存,既不会返回旧资源,也不会每次刷新都全量拉取所有资源)。全局no-store会导致单次刷新瞬间发起几十上百个并发请求,容易触发服务器侧的访问限制。
兜底排查项
如果调整CORS配置后问题仍然存在,按以下顺序排查:
- 检查站点的「动态IP限制」模块配置,查看是否开启了基于并发请求数、请求速率的拦截规则。全局
no-store导致的高并发请求很容易触发默认阈值,导致IP被临时拦截返回403,临时关闭该功能测试即可确认。 - 检查站点根目录及静态资源目录的NTFS权限,确认
IIS_IUSRS用户组拥有目录的读取、列出目录内容权限,权限配置不完整时,高并发场景下偶尔会出现资源读取权限校验失败返回403。 - 开启IIS失败请求跟踪(FREB),针对403状态码配置跟踪规则,触发报错后直接查看跟踪日志里的403子状态码、返回403的对应模块,可直接定位根因,无需盲猜。
内容的提问来源于stack exchange,提问作者Luca_Fly
相关产品推荐
相关产品推荐

