nginx中为静态资源设置全局响应策略的核心是在server块根location /中定义兜底响应头,并通过正则匹配的location ~* .(js|css|...)$统一启用强缓存、禁用autoindex、限制请求方法;gzip等传输优化指令可直接置于http块全局生效。

在 Nginx 中为静态资源设置全局响应策略,核心是统一控制响应头(如缓存、安全、压缩)、禁用目录浏览、限制请求方法,并确保这些策略作用于所有静态资源路径(如 /css/、/js/、/images/ 等),而非逐个 location 重复配置。关键不在于“写多遍”,而在于合理复用与层级继承。
✅ 统一响应头:用 add_header + expires 在 http 块中定义
Nginx 的 add_header 和 expires 指令不能直接写在 http 块顶层生效(它们只在 server 或 location 中生效),但可以通过以下方式实现“类全局”效果:
- 将通用响应策略放在
server块的根location /中; - 利用
location匹配优先级,让更具体的静态路径继承或覆盖它; - 对所有静态资源路径统一启用缓存和安全头。
http {
# 全局 MIME 类型支持
include mime.types;
default_type application/octet-stream;
# 开启 gzip 压缩(全局生效)
gzip on;
gzip_types text/plain text/css application/javascript image/svg+xml;
gzip_min_length 1024;
gzip_vary on;
# 定义一个可复用的缓存策略块(通过 include 或配置模板管理)
# 实际中推荐用 include 引入公共片段,例如:
# include /etc/nginx/conf.d/static-headers.conf;
server {
listen 80;
server_name example.com;
# 【根 location:兜底策略,影响所有未被更具体 location 覆盖的请求】
location / {
root /usr/share/nginx/html;
index index.html;
# 公共响应头(适用于 HTML、图标等)
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer-when-downgrade";
# 默认不缓存 HTML(动态倾向)
expires -1;
}
# 【静态资源专用 location:覆盖根策略,启用强缓存】
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp)$ {
root /usr/share/nginx/html;
# 静态文件缓存 1 年(immutable 提升浏览器复用率)
expires 1y;
add_header Cache-Control "public, immutable";
# 禁用目录列表(即使匹配到空目录也不展示文件列表)
autoindex off;
# 只允许 GET/HEAD(防御非法方法)
if ($request_method !~ ^(GET|HEAD)$) {
return 405;
}
}
# 【可选】单独处理 /api/ 等动态路径,避免被上面正则误匹配
location /api/ {
proxy_pass http://backend;
# 此处不加 expires,保持动态响应特性
}
}
}
? 提示:
location ~* \.这种正则匹配会优先于location /,所以它能精准接管所有静态后缀请求,并应用专属策略。
✅ 禁用目录浏览与非法方法(全局防护)
这两项必须在每个涉及静态资源的 location 中显式配置,因为 Nginx 不会自动继承 autoindex 或 if 逻辑:
-
autoindex off;—— 防止用户访问/images/时看到文件列表; -
if ($request_method ...)—— 防止 POST/PUT 等对静态路径的滥用(注意:if在location内是安全的)。
⚠️ 注意:不要把
if放在server或http块顶层,Nginx 明确不支持。
✅ 静态资源压缩与传输优化(真正全局生效)
以下指令写在 http 块中即对所有响应生效,无需重复:
http {
sendfile on; # 启用内核零拷贝,提升大文件传输效率
tcp_nopush on; # 配合 sendfile,合并 TCP 包
tcp_nodelay on; # 对小响应(如首屏 JS)减少延迟
# Gzip 已在前文开启,此处补充常见优化项
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_disable "msie6";
}
这些属于底层传输层优化,只要 gzip on 开启,所有符合条件的响应(由 gzip_types 控制)都会自动压缩。
✅ 进阶建议:用 map + variables 动态控制响应头
若需更灵活策略(比如根据文件后缀设置不同 Cache-Control),可用 map 提前定义变量:
http {
map $sent_http_content_type $cache_control {
~*text/html "no-cache";
~*text/css "public, max-age=31536000, immutable";
~*application/javascript "public, max-age=31536000, immutable";
~*image/ "public, max-age=31536000";
default "no-cache";
}
server {
location ~* \.(js|css|html|png|jpg|gif)$ {
root /usr/share/nginx/html;
add_header Cache-Control $cache_control;
}
}
}
这样就把缓存策略从硬编码转为数据驱动,便于维护。
不复杂但容易忽略。











