在phpenv中为静态文件设置30天缓存需修改对应站点的vhost配置文件(如c:\phpenv\nginx\conf\vhost\localhost.conf),在server块内添加匹配静态资源的location块,包含expires 30d、add_header cache-control "public, immutable"及try_files $uri =404,并确保该location未被php代理规则覆盖,最后通过命令行nginx -t校验并reload生效。

直接在 phpEnv 的 Nginx 配置中加 expires 指令就能生效,但必须确保它落在匹配静态文件的 location 块里,且不被其他规则覆盖 —— phpEnv 默认配置里没有这行,得手动加。
phpEnv 的 Nginx 配置文件在哪
phpEnv 默认把 Nginx 配置放在:C:\phpEnv\nginx\conf\vhost\ 下,每个站点一个 .conf 文件(比如 localhost.conf)。不要改 nginx.conf 主文件,改对应站点的 vhost 文件更安全。
- 路径中含空格或中文会导致 reload 失败,建议整个 phpEnv 安装目录路径用纯英文、无空格
- 修改前先备份原文件,比如复制一份叫
localhost.conf.bak - 确认该文件确实被
include进主配置:打开C:\phpEnv\nginx\conf\nginx.conf,检查是否有类似include vhost/*.conf;的行
匹配静态文件并设 30 天过期
在站点配置的 server 块内,添加一个专门匹配静态资源的 location,例如:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot|webp|pdf|txt)$ {
expires 30d;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
-
~*表示大小写不敏感正则匹配,比^~更灵活,适合多后缀场景 -
expires 30d生成Expires和Cache-Control: max-age=2592000,浏览器和中间代理都会认 -
immutable很关键:告诉浏览器“这个 URL 对应的内容永不变更”,避免在max-age期内发条件请求(If-None-Match) - 务必加
try_files $uri =404,否则匹配到但文件不存在时会 500 或回源失败
reload 失败或配置不生效的常见原因
改完保存,别直接双击重启,要用命令行操作:
- 进
C:\phpEnv\nginx\目录,运行:nginx.exe -t—— 必须看到success才能继续 - 语法正确后运行:
nginx.exe -s reload;如果提示nginx: [error] invalid PID number,说明 nginx 是通过 phpEnv 控制面板启动的,此时应点面板上的「重启 Nginx」按钮 - 浏览器没走缓存?检查响应头是否真有
Cache-Control:用 DevTools 的 Network 标签页刷新一个.js文件,看 Headers → Response 中有没有cache-control: public, immutable, max-age=2592000 - 如果看到
X-Accel-Expires或X-Sendfile相关头,说明可能被 PHP 脚本拦截了(比如某些 WordPress 插件或框架路由),静态文件没落到 Nginx 的location规则里
真正容易被忽略的是:phpEnv 的默认配置常把所有请求都 proxy_pass 给 PHP-FPM(包括 .css),导致 expires 完全不生效。必须确认你的静态文件是 Nginx 直接 serve 的(即 root 正确指向网站目录,且 location 没被 location ~ \.php$ 之类规则提前截断)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











