解决 Nginx 部署后前端图片乱码的问题
在前端项目部署到 Nginx 之后,可能会遇到 图片文件名乱码 的问题,导致前端无法正确加载图片。这篇文章记录一下遇到该问题的具体情况以及最终的解决方案。
问题描述
当我将前端项目上传到服务器并配置 Nginx 之后,发现部分图片无法正常显示。打开服务器的 image 目录后,看到一堆乱码文件名,比如:
ls image/
#U4E2D#U6587.png #U56FE#U7247.jpg尝试访问这些图片的 URL,Nginx 返回 404,说明文件名解析有问题。
问题分析
从文件名格式来看,它们被编码成了 Unicode 转义格式(#UXXXX),即 #U4E2D#U6587 代表的是 中文。这可能是由于 文件在 Windows 或 macOS 生成时使用了不同的编码格式,但在 Linux 服务器上解析失败。
此外,执行 ls 时如果文件名显示 ??????.png,说明服务器的 系统语言环境 可能不支持 Unicode,需要手动设置(使用下面两行代码即可)。
解决方案
1. 设置服务器语言环境
首先,确保服务器的语言环境支持 UTF-8,防止 ls 命令解析乱码:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8如果 ls 之后文件名仍然是 ??????,可以将这两行添加到 ~/.bashrc 或 ~/.profile,然后执行 source ~/.bashrc 使其生效。
2. 批量转换 Unicode 乱码文件名
进入 image 目录,执行下面的命令,把 Unicode 形式的文件名转换回正常字符:
for file in *; do
newname=$(echo "$file" | perl -pe 's/#U([0-9A-Fa-f]{4})/chr(hex($1))/eg');
mv "$file" "$newname"
done命令解析:
for file in *; do遍历image目录下的所有文件。perl -pe 's/#U([0-9A-Fa-f]{4})/chr(hex($1))/eg'识别#UXXXX格式,并转换为对应的 UTF-8 中文字符。mv "$file" "$newname"把转换后的新文件名应用到旧文件。
执行后,再次 ls,发现文件名已经正常显示,如:
ls image/
中文.png 图片.jpg3. 重启 Nginx 并测试
文件名修正后,重启 Nginx,让新的文件名生效:
systemctl restart nginx然后访问前端页面,发现图片已经能正常加载!
总结
- 文件名乱码可能是 Unicode 转义格式导致的,需要用 Perl 进行转换。
- Linux 服务器可能默认不支持 Unicode,需手动设置
LANG和LC_ALL。 - 修正文件名后,记得重启 Nginx 让更改生效。
希望这次的问题解决过程可以让大家对 Linux 编码格式和文件系统有更深的理解。如果以后再遇到类似问题,可以更快地排查并处理!
版权属于:不冷
本文链接:https://www.buleng.xyz/archives/237/
转载时须注明出处及本声明


我们之间的爱
BamBam南希姐妹的故事