Linux Apache上传的图片因文件名含中文而导致图片不显示,浏览器打开图片报404错误

概述

Linux + Apache建立的网站能正常访问,唯独含中文地址的图片无法显示。本文就为你抽丝剥茧般找出问题原因,同时也是介绍了导致该问题的几种因素及解决方法。

问题描述

因服务器迁移,在Windows下采用zip方式将网站代码压缩打包后上传到Linux + Apache服务器上,配置好网站后能正常访问,但唯独含中文地址的图片无法显示(不含中文地址的图片却显示正常),用浏览器直接打开该图片报404错误。

网页图片不显示,报错404

系统环境
操作系统:CentOS 8.2
运行环境:Apache 2.4.46

解决过程

我将自己解决该问题的过程详细讲解一下,同时也是介绍了导致该问题的几种因素及解决方法。

第一步:排查是否由于URL地址编码问题导致

遇到该问题,首先想到的是编码解析有无问题,网上搜到的解答也基本上都是“用Apache+mod_encoding来解决URL中文编码问题”。URL地址编码问题可以通过设置Internet选项来验证:打开IE浏览器=》Internet选项=》高级=》把”总是以UTF-8发送URL”去掉。更改后还是不显示,该方法不可行。

仔细回想琢磨一下,发现该方法是针对服务器采用gbk编码,然而Linux默认采用UTF-8,因此不应该是网站编码解析的问题。要想验证该想法,还可以通过另一种方法:既然服务器已经是UTF-8编码,我们直接复制一张可显示图片,将文件名改为无法显示图片的中文名称。当我通过ls命令列举文件名时,发现文件名是乱码的(这可能是问题症结所在,先留个疑点),复制图片为中文名称 cp 1.jpg 图片1.jpg,查看网页还是异常,证明确非URL编码导致。

Linux unzip解压后文件名乱码

第二步:文件名编码问题,使用convmv命令转换文件名编码

先安装convmv,再转换文件名,却提示已经是UTF-8,无法转换。

# yum install convmv
# convmv -f gbk -t utf-8 -r --notest ╢╖┬╓╧┤╔░╗·1.jpg
Skipping, already UTF-8: ./╢╖┬╓╧┤╔░╗·1.jpg
Ready! I converted 0 files in 0 seconds.

第三步:解压zip文件乱码,使用unzip -O选项

使用以下命令解压文件,再用ls命令查看文件名正常,刷新网页,图片正常显示,至此问题解决。

unzip -O GBK your_zip_file.zip

我是到此正好解决问题,可能有些系统版本自带的unzip不支持-O选项,那怎么办呢,可以使用以下几种方法:

  1. 给unzip打补丁;
  2. 使用python脚本;
  3. 使用unar等其他解压工具。

这些方法网上有很多,请自行搜索,有需要的可以留言我们共同探讨解决。直至解压出来的文件名显示正常,再看看图片是否显示正常。

问题原理

回想解决过程,问题症结真是由于在Windows压缩文件时,压缩了含有中文GBK编码的文件名,在linux下解压时,却使用了UTF-8编码解压缩,导致文件名乱码。

正是由于系统之间编码方式不同造成的,Windows 的文件名中文编码默认为GBK,压缩或上传后,文件名还会是GBK编码,而Linux中默认文件名编码为UTF-8,这样就会导致windows的文件在Linux下面显示乱码。

转载请注明:半亩方塘 » Linux Apache上传的图片因文件名含中文而导致图片不显示,浏览器打开图片报404错误