
Nginx 中没有 expire 指令,这是常见误解。实际用于控制资源缓存过期时间的是 expires 指令,它设置的是 HTTP 响应头中的 Expires 和 Cache-Control 字段,支持相对时间和绝对时间两种方式。
expires 指令支持绝对时间吗?
支持,但需配合 epoch、max、off 或具体时间字符串(如 "Wed, 21 Oct 2027 07:28:00 GMT")使用。Nginx 本身不解析本地时区或动态计算绝对时间戳,所以“绝对过期时间”通常指明确指定的 GMT 时间字符串。
注意:手动写死 GMT 时间字符串在配置中不灵活,一般只用于极少数固定场景(例如某个静态页确需在某刻彻底失效);生产环境更常用相对时间(如 expires 1h)或结合 add_header 精确控制。
如何用 expires 设置绝对过期时间(GMT 格式)
必须确保时间字符串符合 RFC 1123 格式,且为格林威治标准时间(GMT),例如:
expires "Wed, 21 Oct 2027 07:28:00 GMT";-
expires @2027-10-21T07:28:00Z;❌ 错误 — Nginx 不识别 ISO 8601 时间戳 -
expires "21/Oct/2027:07:28:00 +0000";❌ 错误 — Apache 格式,Nginx 不支持
正确示例(放在 location 块中):
location /static/ {
alias /var/www/static/;
expires "Fri, 31 Dec 2030 23:59:59 GMT";
}
更实用的替代方案:用 add_header 精确控制 Expires 和 Cache-Control
当需要动态或复杂逻辑(比如根据文件类型设不同绝对时间),推荐用 add_header 手动设置响应头,避免 expires 的语法限制:
add_header Expires "Wed, 21 Oct 2027 07:28:00 GMT";add_header Cache-Control "public, max-age=0, must-revalidate";
注意:add_header 在同一作用域内多次出现会覆盖前值(除非使用 always 参数),且不会自动同步 Cache-Control: max-age 与 Expires,需自行保证语义一致。
常见误区与注意事项
-
expires指令不能写在http块顶层直接设绝对时间 — 它必须位于server或location块中生效 - 若同时配置了
expires和add_header Expires,后者会覆盖前者 - 浏览器优先遵循
Cache-Control: max-age,Expires是兼容性兜底;现代实践中建议以Cache-Control为主 - 时间字符串必须全英文、空格严格、时区固定为 GMT,任何格式偏差都会导致 Nginx 启动失败或头字段被忽略


















