文件名称中包含查询字符串。需要 nginx 忽略内容标头的查询字符串

文件名称中包含查询字符串。需要 nginx 忽略内容标头的查询字符串

有一个包含大量文件的目录。这些都是来自备份的静态文件。

问题是一些文件的名称如下:

mystyle.css?version=3.3.1

在提供文件时,nginx 未检测到文件是 css,因此不发送标头Content-Type: text/css,这给我带来了一些麻烦。重命名文件非常麻烦,因为这需要重命名大量文件,同时还要在 html、javascript 等内部重命名它们。是否可以帮助 nginx 忽略 ? 和查询字符串的其余部分,而仅检查 mystyle.css 以确定要提供的 mimetype 类型?

对于 SVG 图像之类的东西来说,这尤其麻烦,因为除非您将它们作为 提供,否则浏览器不会检测到它们image/svg+xml,但这也会在其他情况下造成麻烦。

答案1

Nginx 查看最终文件名并得出结论,扩展名是css?version=3.3.1。它在块中查找它,但未找到匹配项,因此改用types的值。default_type

如果所有 CSS 类型的文件都位于一个文件夹下,而所有 SVG 类型的文件都位于另一个文件夹下 - 或者不同类型的 URI 路径是唯一的,则可以为特定位置内的所有文件设置 mime 类型:

location /css {
    types { }
    default_type text/css;
}

从问题的第一行开始,您就指出有一个目录包含大量文件,可能具有不同的 mime 类型。

您可以使用map带有正则表达式的指令来识别文件的 mime 类型。您需要为目录中包含的每种文件类型添加一行。我的示例仅包含几个。该文件/etc/nginx/mime.types包含 Nginx 通常配置为识别的类型,但您只需将当前存档到此目录的文件类型添加到此目录中。

map $request_uri $type {
    default         application/octet-stream;
    ~*\.css         text/css;
    ~*\.js          application/javascript;
}

server {
    ...
    location /some/path {
        default_type "";
        types { }
        add_header Content-Type $type;
    }
}

免责声明:这可能是一种黑客手段,但似乎有效。

将其设置default_path为空字符串和空types块,可防止 Nginx 添加其自己的 Content-Type 标头。

这个文件了解该map指令的详细信息。

相关内容