换了服务器之后图片404,文件名大小写对不上

来源:互联网 时间:2026-10-28

本地测都好的,传到服务器上图片全是裂的。F12里打开Network,一排404。文件名对着看了一遍又一遍,一个字都不差。可它就是加载不出来。同一批图在本地怎么刷都正常。

Windows的NTFS默认不区分大小写,logo.png和Logo.PNG被当成同一个文件。Linux的ext4区分,是两个文件。开发机上写成什么样都能打开,搬到Linux上,HTML里写的路径和磁盘上实际的文件名差一个字母,返回就是404。这个问题在搬家、换服务器、从虚拟主机迁到VPS的时候最集中,因为文件系统换了。

access.log里404的那批URI先捞出来,筛完再排序去重,规律一眼就能看出来:全是同一批后缀大写的、或者首字母大写的。再拿find . -type f把实际文件名列一遍,跟URI逐条对。写脚本自动比对也行,但通常看十几条样本就够判断了。文件名里带空格、带中文的,URL编码之后又是另一种情况,得单独看。还有一个信号:404的URL里大小写是混着的,比如Product-01.JPG,基本可以定案。awk取第七列的URI,配上sort和uniq排一遍,请求最多的那批就是嫌疑对象。

改文件名还是改HTML,看哪边少。图片是程序上传的,动程序;图片是设计师打包给的,动文件。两边都有的,先动文件再改程序,顺序反了要多跑一轮。

批量转小写用rename:find . -type f | rename 'y/A-Z/a-z/',跑之前先备份,改成小写之后重名的会互相覆盖。改完HTML里的引用同步过去,grep -r Logo.PNG确认没有残留。sed批量替换也行,但要先grep出来看清有多少处,跨行的标签sed处理不了。

还有一种更麻烦的:路径存在数据库里。文章正文的img标签、附件表里的filepath、商品图字段,改文件没用,得改数据。UPDATE之前先select一遍确认范围。带大小写混排的要用BINARY比较,不然MySQL默认的排序规则不区分大小写,匹配出来的比你想要的多得多。改完再跑一遍相同的select,数量对上了才算干净。

想在nginx层面做大小写回退,得写一串rewrite加try_files的组合,规则一多自己都理不清,还多一次磁盘查找。不建议走这条路。真有大量历史文件要兼容,写几条rewrite把大写重定向到小写,比try_files清楚。

改完还要清CDN。之前那批404被边缘节点缓存住了,源站修好,节点还在返回404,看起来像根本没改。静态资源一般缓存时间长。手动刷一遍那批URL,或者改个文件名让它换路径。CDN后台一般有按目录刷新的功能,刷/uploads/整段比逐条刷省事。

以后上传的文件统一转小写再落盘,比事后修省事得多。这条规则写在程序里,换服务器也不会再犯一次。老站的历史文件没法追溯,那就把新上传这批管住。

相关文章

A5创业网 版权所有

返回顶部