Nginx 不提供 if_unmodified_since 指令,但完整支持 HTTP 的 If-Unmodified-Since 请求头,用于条件性操作(如防止覆盖),通过 $http_if_unmodified_since 变量识别,可结合 Last-Modified 实现 412 响应或透传至后端。
Nginx 本身没有
这个配置指令,它只是完整支持 HTTP 协议定义的
请求头。这个头不是用来“开启缓存”的,而是做
条件性资源操作控制
——比如防止并发写入冲突、确保客户端拿到的是未被覆盖的原始版本,尤其在文件同步、断点续传、CDN回源协同等场景中很关键。
If-Unmodified-Since 是什么?
它是客户端发来的标准 HTTP 请求头,格式类似:
语义是:“请只在目标资源自该时间点之后
从未被修改过
的情况下,才执行本次请求(如返回内容、接受上传);否则返回
”。
这个判断依据通常是响应头中的
值。Nginx 不自动比对,但提供了变量和机制让你自己实现逻辑。
如何在 Nginx 中识别并响应 If-Unmodified-Since
Nginx 把这个头解析后存为内置变量
,你可以用它做条件判断:
检查是否携带该头:
结合
做简单拦截(适用于静态文件服务):
⚠️ 注意:
在
外不可用于重写,且不推荐嵌套复杂逻辑。生产环境更稳妥的做法是透传该头给后端应用处理。
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
在文件同步场景下的典型用法
比如一个客户端要上传新版本文件,但希望“仅当服务端当前文件没被别人改过”才允许覆盖——这就需要
配合
或
请求。
客户端先
,拿到响应头:
然后发起带条件的上传:
Nginx 可以:
直接透传该头到后端(关闭 proxy_ignore_headers);
或者由 Nginx 自己比对(需配合
+ 时间格式标准化);
若检测到文件已被修改(比如
获取的 mtime > 请求头时间),就
。
这样就能避免“静默覆盖”,保障最终一致性。
与缓存模块和反向代理的协作要点
会自动处理
和
,但
仅限于返回或直接响应体
,不主动返回
;
启用
时,默认会
剥离
等条件头,不转发给上游——必须显式配置:
如果你用 Nginx 做 CDN 边缘节点,又需要源站校验版本,就必须确保这个头能穿透多层代理到达业务后端。
不复杂但容易忽略
if_unmodified_sinceIf-Unmodified-SinceIf-Unmodified-Since: Wed, 21 Oct 2024 07:28:00 GMT412 Precondition FailedLast-Modified$http_if_unmodified_sinceif ($http_if_unmodified_since) {
# 进入条件分支
}Last-Modifiedlocation /files/ {
add_header Last-Modified $date_gmt;
if ($http_if_unmodified_since) {
# 注意:这里仅作示意,真实时间比对需更严谨(时区、格式、精度)
return 412;
}
}iflocationIf-Unmodified-SincePUTPOSTGET /doc.pdfLast-Modified: Tue, 05 May 2026 10:30:00 GMTPUT /doc.pdf
If-Unmodified-Since: Tue, 05 May 2026 10:30:00 GMTmapstat()return 412ngx_http_not_modified_moduleIf-Modified-SinceIf-Unmodified-Since304 Not Modified412proxy_cacheIf-Unmodified-Sinceproxy_pass_request_headers on;
proxy_set_header If-Unmodified-Since $http_if_unmodified_since;