问题描述
在开发一个 ASP.NET Core 8.0 的网站,使用 asp-append-version 自动给 js 和 css 文件添加版本号。 代码如下:
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
之前还是好的,但是不知道啥时候,就不好用了。即,没有后面的版本号了(文件 hash)
问题根源
为了方便 Nginx 转发 /tools4 的请求到这个 ASP.NET Core 的服务上,我统一添加了前缀。
而版本号的计算,是基于文件进行计算的,而文件的目录是相对 wwwroot 的地址。
所以,我手动添加了前缀之后,虽然能在浏览器中访问,但是,在计算版本号时,基于这个路径就找不到对应的文件了。
例如,我设置的前缀是 tools4
<link rel="stylesheet" href="~/tools4/css/site.css" asp-append-version="true" />
这个前缀就是问题的根源。
Program.cs 设置 app.UsePathBase
例如:
app.UsePathBase("/tools4"); // 新添加
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(...);
这样就统一加上前缀了。
也就不再需要之前繁琐的 MapGroup 及 wwwroot StaticFile RequestPath 配置了。
测试
这样修改之后,确实正常了。比较奇怪的是,加不加前缀都是支持的。。。 即,下面两个链接都能正常访问。
- http://localhost:5000/tools4
- http://localhost:5000
且 wwwroot 下的静态文件都做了对应处理。
StackOverflow 上有个同样的问题,我看 github 上也有人提到了,但是没有回答。
https://stackoverflow.com/questions/77991947/net-core-usepathbase-why-original-route-still-working
这个可以暂时忽略,因为并不影响我目前的使用。
版本号格式
cshtml 中的代码:
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
对应的生成格式:
http://localhost:5000/css/site.css?v=KLjfQfNTfT6FLjPvGFVN500tbbJKDcPi9EpAGZuRf_g
http://localhost:5000/tools4/css/site.css?v=KLjfQfNTfT6FLjPvGFVN500tbbJKDcPi9EpAGZuRf_g
注意,加了前缀的和不加前缀的链接,都能正常访问。
但是,如果用没有定义的前缀,比如 tools5 去访问,就会报 404.
appsettings.json 配置 PathBase (没有必要)
可以通过,appsettings.json 及 appsettings.Development.json, 方便的区分开发环境和生产环境。
特别是在 watch 模式下,不用手动再输入前缀了。
但是,由于加不加前缀都能正常访问,所以在开发调试的时候,也就没有必要单独再指定一个 PathBase 为 / 的情况了。
参考
- https://stackoverflow.com/questions/56055697/how-to-change-base-url
- https://www.jianshu.com/p/1562db5d2b28
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式