Nginx - 提供文件名中包含空格的静态 HTML 内容

Nginx - 提供文件名中包含空格的静态 HTML 内容

我使用这个设置来提供静态 html 文件:

server {
    root /var/www/static_html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/index.html $uri.html =404;
        autoindex on;
    }
}

现在,如果文件名包含空格,"spam spam.html"则响应为“404 Not Found”

在access.log中:

"GET /spam%20spam.html HTTP/1.1" 404

可以提供这些文件吗?

答案1

当我尝试设置 NGINX 以从与 JPG/PNG 相同的文件名提供 WebP 文件时,我遇到了同样的问题,并且某些文件包含空格。发生这种情况的原因是:

  • 空格不能在 URL 中使用,浏览器会自动将 URL 中的空格替换为%20,您可能已经注意到
  • 在这种情况下,变量$uri将包含链接,%20正如您从日志中看到的那样
  • 当 NGINX 在磁盘上寻找%20名称中包含 的文件时,它将无法找到它,因为在磁盘上它存储在空间中而不是 中%20,因此会导致 404。

实现这个功能的一个潜在方法是用%20空格替换,而我想到实现这个功能的唯一方法是使用类似 OpenRestly 的 Lua NGINX 模块:

https://github.com/openresty/lua-nginx-module​​

然后,正确安装和配置后(不太容易!),你可以在之前尝试这样的事情try_files

access_by_lua_block {
        ngx.var.uri = string.gsub(ngx.var.uri, "%20", " ")
}

这实际上没有经过测试,这只是一个想法。如果有更好的方法来实现这一点,我愿意去检查!

相关内容