SpringBoot服务端静态资源映射规则及页面资源引用路径问题
Spring Boot 静态资源映射规则
Spring Boot 静态资源默认映射逻辑非常清晰,类路径下4个固定目录内的文件,会直接映射到服务端根路径/**下,不需要加额外前缀就能访问,目录优先级从高到低为:
classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/
举个例子,你把css文件夹放在classpath:/static/下面,那最终访问css文件的路径就是http://服务地址/css/xxx.css,和html文件放在这四个目录里的哪个位置没有直接绑定关系。
相对路径引用失效的核心原因
这里绝大多数开发者都会踩一个认知误区:html里写的./这类相对路径,是浏览器根据当前地址栏的URL解析的,和文件在服务端的存储层级没有任何关系。
相对路径的解析规则很明确:以当前URL最后一个斜杠前的路径作为基准目录,拼接你写的相对路径得到最终资源地址。
你现在遇到必须加sign/前缀才能访问css的情况,本质是你打开sign.html的时候,地址栏的URL本身就带/sign/层级:
比如你访问页面的地址是http://localhost:8080/sign/sign.html,或者是带尾斜杠的http://localhost:8080/sign/,这时候./对应的基准路径就是/sign/,你写./css/xxx.css,浏览器实际请求的地址是/sign/css/xxx.css,但你实际的css文件映射的访问地址是/css/xxx.css,自然会加载失败。
反过来你加了sign/前缀能加载,反而说明你当前项目里css文件实际映射的访问路径就是/sign/css/xxx.css,大概率是你把css文件夹和sign.html都放在了静态资源目录下的sign子文件夹里,和你以为的“css和sign.html在同级根目录”的认知有偏差。
避坑建议
- 静态资源引用最稳妥的写法永远是用根相对路径,也就是直接写
/css/你的样式文件名.css,这种写法会直接从服务端根路径开始拼接资源地址,完全不受当前页面访问URL的层级影响,不会出现路径解析错位的问题。 - 不要依赖
./这类相对路径写静态资源引用,只要页面访问路径的层级变了(比如加了路由前缀、路径尾斜杠变化、做了路径转发),相对路径直接就会失效。 - 可以检查下自己的配置:有没有修改
spring.mvc.static-path-pattern自定义静态资源访问前缀,有没有写Controller/视图控制器调整过sign.html的访问路径,有没有静态资源放错目录没被Spring Boot默认扫描到。
内容的提问来源于stack exchange,提问作者awxiaoxian2020
相关产品推荐
相关产品推荐

