phpenv 默认不启用静态资源缓存,需手动配置 nginx 的 location 块并设置 expires 和 cache-control;否则 .js/.css/.png 等请求直通 php-fpm,完全失去缓存意义。

phpEnv 默认不启用静态资源缓存,必须手动配置 Nginx 的 location 块并设置 expires 和 Cache-Control,否则所有 .js/.css/.png 等请求都会直通 PHP-FPM,完全失去缓存意义。
phpEnv 中 Nginx 静态后缀匹配失效的常见原因
phpEnv 封装的 Nginx 配置通常把全部请求(包括 .js、.css)都交给 fastcgi_pass 处理,导致静态文件根本不会走磁盘读取,更不会触发 expires。你看到的响应头里没有 Cache-Control 或 Expires,基本就是这个原因。
- 检查
/phpenv/nginx/conf/vhost/xxx.conf是否存在覆盖性location ~ \.php$规则,且该规则写在了静态location之前 - 确认没有用
try_files $uri $uri/ /index.php?$args;这类兜底逻辑,把/static/logo.png也转发给了 PHP - phpEnv 的默认模板常把
root指向/phpenv/www,但实际静态文件可能在/phpenv/www/public或/phpenv/www/dist,路径不匹配会导致try_files $uri =404直接 404,而非返回文件
正确配置静态后缀缓存的 location 块
必须把静态资源 location 放在所有 fastcgi_pass 规则之前,并显式指定 root 和文件存在性校验:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot|webp|pdf|xml|txt)$ {
root /phpenv/www/public;
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options nosniff;
try_files $uri =404;
}
-
root必须写全路径,不能依赖外层server块的root—— phpEnv 的多站点结构容易让路径继承出错 - 删掉该
location内任何fastcgi_pass或proxy_pass,否则缓存头无效 -
immutable仅适用于带哈希指纹的文件(如app.a1b2c3.js),若用时间戳或无版本号,改用public, max-age=31536000
验证缓存是否生效的三个关键检查点
别只看浏览器开发者工具 Network 标签页,它可能被 DevTools 的 “Disable cache” 开关干扰:
- 用
curl -I https://yoursite.com/static/main.css查看响应头:必须有Cache-Control和Expires,且状态码是200(不是200 OK via php-fpm) - 检查 Nginx error log:
tail -f /phpenv/nginx/logs/error.log,如果出现open() "/phpenv/www/public/static/main.css" failed (2: No such file),说明root路径或try_files路径错了 - 对比两次请求的
X-Content-Type-Options是否一致;若第一次有、第二次没了,大概率是 CDN 或中间代理覆盖了响应头
最易被忽略的是:phpEnv 启动脚本有时会自动重载 Nginx 配置,但不会清理旧 worker 进程,导致新配置不生效。执行 /phpenv/nginx/sbin/nginx -s reload 后,再用 ps aux | grep nginx 确认 master 进程启动时间已更新。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











