![文件名称中包含查询字符串。需要 nginx 忽略内容标头的查询字符串](https://linux22.com/image/728077/%E6%96%87%E4%BB%B6%E5%90%8D%E7%A7%B0%E4%B8%AD%E5%8C%85%E5%90%AB%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E3%80%82%E9%9C%80%E8%A6%81%20nginx%20%E5%BF%BD%E7%95%A5%E5%86%85%E5%AE%B9%E6%A0%87%E5%A4%B4%E7%9A%84%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
有一个包含大量文件的目录。这些都是来自备份的静态文件。
问题是一些文件的名称如下:
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
指令的详细信息。