在IIS部署网站的过程中,很多开发者会通过URL重写或者重定向规则来实现伪静态、域名跳转、请求转发等功能,但配置完成后经常会出现CSS、JS、图片等静态资源无法加载的情况,页面样式丢失、交互功能失效,影响网站正常使用。

问题常见原因
静态资源加载失败大多是URL重写规则的匹配逻辑不合理导致的,常见原因有以下几种:
- 规则没有排除静态资源的请求路径,导致静态文件请求被重写到动态处理程序
- 规则的正则表达式匹配范围过大,误将静态资源请求纳入处理范围
- 重定向规则配置错误,把静态资源的请求路径也进行了跳转
- 规则的优先级设置不合理,静态资源的处理规则没有优先生效
排查与解决步骤
1. 检查现有重写规则配置
首先打开IIS管理器,找到对应站点的URL重写模块,查看已经配置的所有规则,重点关注规则的匹配条件和操作类型。如果是通过web.config配置的规则,可以直接查看配置文件中的rewrite节点内容。
2. 添加静态资源排除规则
最常见的解决方法是在重写规则的最前面添加一条排除静态资源的规则,让所有静态资源的请求直接跳过后续的重写处理。以下是针对常见静态资源类型的排除规则配置示例,放在所有其他规则之前:
<configuration>
<system.webServer>
<rewrite>
<rules>
<!-- 静态资源排除规则,优先级最高 -->
<rule name="ExcludeStaticResources" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAny">
<add input="{REQUEST_FILENAME}" matchType="IsFile" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" />
<!-- 匹配常见静态资源后缀 -->
<add input="{REQUEST_URI}" pattern=".(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$" ignoreCase="true" />
</conditions>
<action type="None" />
</rule>
<!-- 其他自定义重写规则放在这里 -->
<rule name="DynamicRewrite">
<match url="^article/([0-9]+)$" />
<action type="Rewrite" url="article.aspx?id={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
这个规则的核心是stopProcessing="true"属性,当请求匹配到静态资源条件时,会直接终止后续所有规则的处理,请求会按照原路径访问对应的静态文件,不会被重写或重定向。
3. 调整现有规则的匹配条件
如果不想添加单独的排除规则,也可以修改现有重写规则的匹配条件,缩小匹配范围,避免匹配到静态资源。比如原来的规则是匹配所有请求,可以修改为只匹配动态页面的路径:
<rule name="DynamicRewrite">
<match url="^(article|news|product)/.+$" />
<conditions>
<!-- 排除静态资源后缀 -->
<add input="{REQUEST_URI}" pattern=".(css|js|jpg|png|gif)$" ignoreCase="true" negate="true" />
</conditions>
<action type="Rewrite" url="index.aspx" />
</rule>
这里通过negate="true"表示当请求 URI 不匹配静态资源后缀时才触发规则,从而避免静态资源被重写。
4. 检查规则优先级
IIS的URL重写规则是按照配置的顺序从上到下依次执行的,如果静态资源排除规则放在了其他规则后面,可能不会被触发。因此需要确保所有排除静态资源的规则都放在所有其他重写规则的最前面,保证优先执行。
验证解决方法
修改完配置后,可以通过浏览器的开发者工具查看网络请求,检查静态资源的请求状态码是否为200,响应内容是否正确。如果静态资源还是无法加载,可以开启IIS的URL重写跟踪功能,查看请求的匹配过程,定位具体是哪条规则导致了问题。
开启跟踪的方法是在IIS管理器中找到失败请求跟踪规则,添加针对*.css、*.js等静态资源后缀的跟踪规则,之后访问静态资源,查看生成的跟踪日志,就能清楚看到请求经过了哪些规则处理,从而找到问题所在。