IIS子目录部署Blazor WASM改写base href后无尾斜杠URL资源先404后200问题
现象原因
浏览器解析HTML是从上到下逐行处理的,你遇到的404后自动恢复的现象执行流程如下:
- 当你输入末尾不带斜杠的应用URL(比如
https://你的域名/MyApp)时,服务器先返回站点的HTML文件 - 浏览器首先解析到空的
<base />标签,此时还没执行你写的动态修改<base>的JavaScript代码,就会直接以当前无斜杠的URL作为相对资源的基准路径,发起所有css、js等静态资源请求,路径拼接规则错误直接导致全部404 - 静态资源请求发起后,你的JavaScript代码才开始执行,触发末尾加斜杠的页面重定向逻辑
- 重定向到带斜杠的URL后,新页面的
<base>标签被正确赋值,所有资源请求路径符合预期,返回200正常加载
修复方案
你可以根据自己的部署场景选择以下任意一种方案:
- 方案1(推荐):服务端配置重定向
直接在IIS中配置URL重写规则,把所有匹配Blazor应用子目录、且末尾不带斜杠的请求,用301/302重定向到末尾带斜杠的地址。这个方案在请求到达应用之前就处理了路径问题,完全不会触发客户端的无效资源请求。 - 方案2:调整资源引用路径
把页面中所有css、js、图片等静态资源的相对路径引用,改为从站点根目录开始的绝对路径,比如把原相对路径css/app.css改为/MyApp/css/app.css,这类绝对路径的资源请求不受<base>标签影响,不管基准路径是否正确都能命中正确资源。 - 方案3:调整脚本加载顺序
把你写的动态修改<base>标签的JavaScript代码移动到<head>标签的最顶部,放在所有静态资源引用代码的前面,确保浏览器解析资源引用之前,<base>标签的href属性已经被正确设置,同时可以把末尾加斜杠的重定向逻辑提前,减少无效请求的产生。
内容的提问来源于stack exchange,提问作者iBener
相关产品推荐
相关产品推荐

