在http模块写上
http{
# 1. 定义是否为静态文件
map $uri $is_static_file {
default 0;
~*\.(gif|png|jpg|jpeg|webp|css|js|woff|woff2|svg|ico|ttf|eot|pdf|doc|docx|xls|xlsx|ppt|pptx|mp4|avi|mov|wmv|flv|swf|zip|rar|tar|gz)$ 1;
}
# 2. 定义是否跳过服务端缓存
map $is_static_file $bypass_cache {
1 0; # 静态文件:不跳过缓存
0 1; # 动态API:跳过缓存
}
# 3. 定义浏览器缓存时间
map $uri $browser_cache_expires {
default -1; # 动态内容:不缓存
~*\.(gif|png|jpg|jpeg|webp|ico|svg|mp4|avi|mov|wmv|flv|swf|pdf|zip|rar|tar|gz)$ "365d"; # 图片/视频:缓存1年
~*\.(css|js|woff|woff2|ttf|eot)$ "30d"; # CSS/JS/字体:缓存30天
~*\.(doc|docx|xls|xlsx|ppt|pptx)$ "7d"; # Office文档:缓存7天
}
# 4. 定义浏览器 Cache-Control 头
map $uri $browser_cache_control {
default "no-cache, no-store, must-revalidate"; # 动态内容:强制不缓存
~*\.(gif|png|jpg|jpeg|webp|ico|svg|mp4|avi|mov|wmv|flv|swf|pdf|zip|rar|tar|gz)$ "public, immutable"; # 图片等:永久缓存
~*\.(css|js|woff|woff2|ttf|eot)$ "public, max-age=2592000"; # CSS/JS:缓存30天
~*\.(doc|docx|xls|xlsx|ppt|pptx)$ "public, max-age=604800"; # Office文档:缓存7天
}
# 5. 定义服务端缓存路径
proxy_cache_path /www/wwwroot/cache
levels=1:2
keys_zone=api_cache:10m
max_size=5g
inactive=30d
use_temp_path=off;
}
在你反向代理或者配置里写上
location ^~ /api/ {
# ------------------------------
# 1. 核心代理逻辑(保留你的原有配置)
# ------------------------------
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:31000/;
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_connect_timeout 1000s;
proxy_send_timeout 1000s;
proxy_read_timeout 1000s;
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
client_max_body_size 100m;
# ------------------------------
# 2. 服务端缓存配置
# ------------------------------
proxy_cache api_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 206 301 302 30d;
proxy_cache_bypass $bypass_cache;
proxy_no_cache $bypass_cache;
# 忽略后端干扰 Nginx 缓存的头
proxy_ignore_headers Cache-Control Expires Set-Cookie;
# 隐藏后端返回的所有缓存相关头(防止传给浏览器)
proxy_hide_header Cache-Control;
proxy_hide_header Expires;
proxy_hide_header Pragma;
proxy_hide_header Surrogate-Control;
proxy_hide_header Set-Cookie;
# 添加服务端缓存命中状态头
add_header X-Cache-Status $upstream_cache_status always;
# ------------------------------
# 3. 浏览器缓存配置(严格区分静态/动态)
# ------------------------------
# 统一添加缓存头(根据 map 变量自动区分)
expires $browser_cache_expires;
add_header Cache-Control $browser_cache_control always;
# ✅ 仅动态 API 补充这两个头
if ($is_static_file = 0) {
add_header Pragma "no-cache" always;
add_header Expires "0" always;
}
# 静态文件关闭访问日志(减少磁盘 IO)
access_log off;
}
文章评论