IIS路由站点Rewrite规则访问/current时无法找到资源文件求助
你完全猜对了问题所在!当你访问http://testpage.com/current时,IIS把请求重写到了5001端口的根路径,顺利拿到了index.html。但页面里的<script src="/index.js">是绝对路径,浏览器会直接发起http://testpage.com/index.js的请求——这个URL根本不匹配你的^current(.*)?重写规则,自然不会被转发到5001端口,服务器找不到资源就返回404了。而当你用^(.*)?规则时,所有请求都被转发到5001,所以静态资源也能正常加载。
这里有几个快速解决的方案,你可以根据自己的需求选择:
1. 修改静态资源引用为相对路径(最简单)
直接修改5001站点里index.html的资源引用,把绝对路径改成相对路径:
<script type="text/javascript" src="index.js"></script> <!-- 或者用 ./ 明确表示当前目录 --> <script type="text/javascript" src="./index.js"></script>
这样当浏览器从/current路径加载页面时,会自动请求/current/index.js,这个URL会匹配你的原重写规则,被转发到5001端口的/index.js,就能正常加载资源了。
2. 添加额外的重写规则覆盖静态资源请求
如果你不想修改5001站点的代码,可以在路由站点的web.config里添加一条新规则,专门匹配那些本该指向5001站点的静态资源请求:
<!-- 建议放在原RewriteRule之前 --> <rule name="RewriteStaticAssetsForCurrent" stopProcessing="true"> <match url="^index.js$" /> <!-- 可扩展为匹配所有静态资源:^.*\.(js|css|png|jpg|svg)$ --> <conditions> <!-- 可选:确保请求来自访问/current页面的用户,避免误转发其他站点资源 --> <add input="{HTTP_REFERER}" pattern="http://{HTTP_HOST}/current" /> </conditions> <action type="Rewrite" url="http://{HTTP_HOST}:5001/{R:0}" /> </rule> <!-- 你的原重写规则 --> <rule name="RewriteRule" stopProcessing="true"> <match url="^current(.*)?" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://{HTTP_HOST}:5001/{R:1}" /> </rule>
这个规则会把直接请求/index.js的请求(来自/current页面的)转发到5001端口。如果需要覆盖更多静态资源,把match里的^index.js$改成^.*\.(js|css|png|jpg|svg)$即可。
3. 使用HTML的<base>标签统一资源路径
在5001站点的index.html头部添加<base>标签,指定页面中所有相对路径的基准URL:
<head> <base href="/current/" /> <!-- 其他头部内容 --> </head>
这样页面里的所有相对路径资源都会以/current/为基准,比如src="index.js"会被解析成/current/index.js,同样会被你的重写规则转发到5001的/index.js。这个方法适合页面里有大量静态资源的情况,不用逐个修改引用路径。
内容的提问来源于stack exchange,提问作者MistyK

