Sinatra 服务器不提供名称中带有“+”的文件

Sinatra Server not serving Files with a '+' in Name

我的 Sinatra 服务器 public 文件夹中的一些文件名称中有一个“+”。 当我尝试通过浏览器访问这些文件时,出现 404 错误。没有额外的日志输出。

我三重检查文件确实存在并且 URL 是正确的。我可以访问 public 文件夹中的其他文件。如果我重命名这些文件,使它们的名称中不包含“+”,我也可以访问它们。

不幸的是,我无法避免在我的文件名中包含“+”字符。

以前有过这种经历吗?

Sinatra 源代码中的罪魁祸首似乎是这一行:

  path = File.expand_path("#{public_dir}#{unescape(request.path_info)}"

其行为归结为

URI.decode_www_form_component('a+b', 'utf-8')  # returns "a b"

在此行之前,request.path_info 中的任何 + 个字符都将替换为 space。

听起来您不打算将此网络服务器用于一个简单的项目。在这种情况下,我强烈建议您不要将 Sinatra 用作文件服务器,而是将其隐藏在反向代理(例如针对发送文件进行了高度优化的 nginx)之后。如果 nginx 找不到文件,它会将请求转发给 sinatra 网络服务器来处理。