协商缓存(也称为条件请求)是HTTP缓存的一种机制,它允许浏览器在资源可能已更改的情况下验证缓存副本是否仍然有效。以下是配置Nginx实现协商缓存的详细方法:
server {
# 其他配置...
location / {
# 启用ETag
etag on;
# 关闭强制缓存,让浏览器每次都发送验证请求
add_header Cache-Control "no-cache, must-revalidate";
# 设置Last-Modified头
if_modified_since before;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
# 对静态资源启用ETag
etag on;
# 设置Last-Modified头
if_modified_since before;
# 允许浏览器缓存但需要验证
add_header Cache-Control "public, no-cache";
}
}
location / {
# 确保Nginx发送Last-Modified头
if_modified_since before;
# 告诉浏览器需要验证缓存
add_header Cache-Control "no-cache";
}
location / {
# 启用ETag生成
etag on;
# 告诉浏览器需要验证缓存
add_header Cache-Control "no-cache";
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
# 启用ETag
etag on;
# 设置Last-Modified头
if_modified_since before;
# 允许公开缓存但需要验证
add_header Cache-Control "public, no-cache";
# 可选:设置过期时间为较短时间,作为后备
expires 1h;
}
location ~* \.(php|asp|aspx)$ {
etag off;
}
location / {
# 使用文件大小和修改时间生成ETag(默认行为)
etag on;
# 或者完全自定义ETag
# add_header ETag "custom-etag-value";
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
etag on;
if_modified_since before;
# 设置强缓存时间(如1年),但同时需要验证
add_header Cache-Control "public, max-age=31536000, must-revalidate";
}
配置完成后,可以通过以下方式验证:
使用浏览器开发者工具查看网络请求
ETag
和Last-Modified
If-None-Match
或If-Modified-Since
头使用curl命令测试
curl -I http://yourdomain.com/yourfile.js
查看返回的头部信息
第二次请求应该返回304 Not Modified状态码
通过以上配置,你可以有效地实现浏览器协商缓存,减少不必要的带宽使用,同时确保用户始终获取最新的内容。