在我最近搭建的一个视频站点中,遇到了一个奇怪的问题——明明文件已经放在正确目录,权限也没问题,访问时却总是返回 404 错误。经过一番排查,终于发现问题根源竟然是文件名中的空格!这让我对 URL 编码和规范有了更深刻的理解,也想在这里分享给大家。
一、问题复现:访问视频文件为什么会 404?
我用 Nginx 配置了一个 HTTPS 视频站点,站点根目录是/var/www/my_site
,视频文件放在/var/www/my_site/video
目录下。
文件名示例:
example video file.mp4
当我直接访问:
https://example.com/video/example video file.mp4
浏览器报 404,日志显示找不到该文件。
- 文件权限正常
- 路径配置正确
- Nginx 访问日志和错误日志没发现明显权限问题
怀疑是不是配置问题,反复确认也没错。
二、罪魁祸首:文件名中的空格
其实我也是通过问 ChatGPT 才彻底弄明白:文件名中的空格在 URL 里是非法字符,必须用 URL 编码代替。
浏览器地址栏有时会自动帮你把空格转成 %20
,但如果你直接在 HTML 或链接里写了空格,或者服务器配置不支持带空格的路径匹配,就会导致资源无法找到,返回 404。
简单来说,文件名和 URL 路径中的“空格”是不被网络协议接受的“非法字符”,服务器找不到对应路径。
三、URL 编码的标准和允许的特殊字符
URL 编码遵循 RFC 3986 标准,其中:
允许直接使用的字符包括:
- 字母(A-Z,a-z)
- 数字(0-9)
- 一些安全字符:
-
、_
、.
、~
- 其他字符(包括空格、中文、
#
、?
、&
、/
、%
等)必须用%
后跟两位十六进制数的编码形式表示。
例如:
字符 | 编码 |
---|---|
空格 | %20 |
# | %23 |
% | %25 |
中文 | UTF-8 编码后的 %XX%XX |
更多详细允许字符和编码规则,可以查看这份官方标准文档:
https://datatracker.ietf.org/doc/html/rfc3986
看不懂可以看中文版:
https://rfc2cn.com/rfc3986.html
四、URL 规范经验总结
- 避免空格:空格必须编码为
%20
,否则服务器无法识别路径,可能导致 404。 - 优先使用英文和安全字符:文件名和路径应只包含英文(A-Z,a-z)、数字(0-9)及
- _ . ~
,避免复杂字符。 - 避免中文和非 ASCII 字符:非英文字符必须编码(如
%E4%B8%AD%E6%96%87
),这会降低可读性并可能引发兼容问题,建议直接用英文命名。 - 特殊字符必须编码:如
# % & ? /
等,避免路径解析错误和安全风险。 - 保持大小写一致:URL 及文件系统通常区分大小写,建议统一规范。
- 访问时使用编码后的 URL:浏览器通常会自动编码,也可手动编码,避免直接输入未编码字符。
- 使用编码工具:推荐使用
encodeURIComponent()
、在线编码器或语言自带函数来正确编码 URL。
附录:常用 URL 编码工具
- 在线工具:urlencoder.org
- 浏览器开发者工具中的 Network 面板查看请求 URL
- 编程语言自带的编码函数,如 JavaScript 的
encodeURIComponent