Nginx中root定义文件路径,expires设置缓存过期时间;二者需共存于location块中,推荐用正则匹配静态资源后缀并配置expires 1y和immutable。

在 Nginx 中,root 指令本身不直接控制缓存,它只定义文件系统的根路径;真正设置静态资源缓存过期时间的是 expires 指令,需配合 location 块精准匹配资源路径,并确保请求能落到正确的文件系统位置。
明确 root 和 expires 的分工
root 用于拼接 URI 到磁盘路径(例如 root /var/www/html; + 请求 /css/app.css → 实际读取 /var/www/html/css/app.css);expires 则在响应头中写入 Cache-Control 和 Expires,由浏览器/代理决定是否缓存及缓存多久。二者无直接语法关联,但必须共存于能命中静态文件的 location 块中才生效。
推荐写法:用 location 匹配后缀,内部用 root + expires
以下配置将所有常见静态资源(js/css/png/jpg/gif等)统一缓存 1 年,且路径解析正确:
nginx.conf 或 server 块内:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 全局 root,作为默认文件根
root /var/www/html;
# 针对静态资源后缀单独配置缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot)$ {
# 可选:显式指定 root(若与外层不同),否则继承外层 root
# root /var/www/html;
# 关键:启用 expires 缓存控制
expires 1y;
add_header Cache-Control "public, immutable";
}}
说明:
-
location ~*大小写不敏感正则匹配,覆盖主流静态类型 -
expires 1y生成Expires头(绝对时间)和Cache-Control: max-age=31536000(相对秒数) -
add_header Cache-Control "public, immutable"补充语义:资源不可变,允许 CDN 和浏览器长期强缓存 - 无需在该 location 内重复写
root,除非你要为静态资源单独指定另一目录(如/static子目录)
注意 root 路径与 URI 的拼接逻辑
如果静态资源实际放在子目录(比如所有图片在 /var/www/html/images/),而你希望访问 /img/logo.png 时读取该路径,就不能只靠外层 root。此时有两种方式:
-
方式一(推荐):调整 location 的匹配和 root
location /img/ { root /var/www/html; expires 1w; }
请求/img/logo.png→ 拼成/var/www/html/img/logo.png -
方式二:用 alias 替代 root(更精准)
location /img/ { alias /var/www/html/images/; expires 1w; }
请求/img/logo.png→ 直接映射到/var/www/html/images/logo.png(注意 alias 后必须带尾部/)
⚠️ 错误示例:root /var/www/html/images; + location /img/ → 实际找的是 /var/www/html/images/img/logo.png,多了一层 img,容易出错。
验证缓存是否生效
重启 Nginx 后,用 curl 检查响应头:
curl -I https://example.com/style.css
应看到类似:
Cache-Control: public, immutable, max-age=31536000 Expires: Wed, 01 Jan 2026 00:00:00 GMT
若没出现,检查:
– 请求是否真的命中了含 expires 的 location(可用 error_log /path/to/log notice; 加 log_not_found on; 辅助调试)
– 文件是否存在且 Nginx 有读取权限
– 是否被 upstream 或其他模块(如 proxy_pass)覆盖了响应头


















