有一个包含大量文件的目录。这些都是来自备份的静态文件。
问题是一些文件的名称如下:
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
指令的详细信息。