Ubuntu下Node.js Express public/js静态文件无法访问问题
问题原因
这个问题本质上是Ubuntu文件系统默认严格大小写敏感,和你之前用的Windows、MacOS默认的大小写不敏感规则不一致。
Windows、默认配置的MacOS文件系统不会区分路径中的大小写:代码里写/js,不管实际文件夹叫js、JS还是Js,系统都能正常匹配到对应目录返回资源。但Ubuntu常用的ext4、xfs文件系统对路径大小写是精确匹配的,只要名称大小写、字符有一点不一致,就会直接判定路径不存在。
排查修复步骤
- 核对目录实际名称
进入项目public目录执行ls -la,查看存放脚本的目录实际名称,90%以上的概率你会看到目录名不是全小写的js,而是JS、Js这类大小写混合的命名——这就是为什么改目录名就能正常访问,用js名就报错。
修复方式二选一即可:- 把目录重命名为全小写
js,和代码里写的路径完全一致 - 把代码里静态资源配置的路径改成和实际目录名完全匹配的大小写
- 把目录重命名为全小写
- 检查中间件注册顺序
确认express.static相关的配置代码,写在所有匹配/js前缀的自定义路由、其他业务中间件之前。Express是按代码注册顺序匹配请求的,如果前面的逻辑提前拦截了/js开头的请求,根本不会走到静态资源服务的逻辑,也会返回404。 - 排查特殊字符/权限问题
如果核对完大小写还是有问题:- 删掉现有js目录,在Ubuntu环境下直接执行
mkdir -p public/js新建目录,再把原有脚本文件移进去,避免跨系统同步时目录名带上不可见的特殊字符导致匹配失败 - 执行
ls -l public/查看js目录权限,确保运行Node服务的账号对该目录及内部文件有读、执行权限,权限不足时执行sudo chmod -R 755 public/js修复即可。
- 删掉现有js目录,在Ubuntu环境下直接执行
内容的提问来源于stack exchange,提问作者Csaba Horváth
相关产品推荐
相关产品推荐

