在我最近搭建的一个视频站点中,遇到了一个奇怪的问题——明明文件已经放在正确目录,权限也没问题,访问时却总是返回 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