phpEnv 下静态资源应禁用 ETag 并启用 immutable 强缓存,HTML 则需确保 Last-Modified 准确;Nginx 默认不支持内容哈希 ETag,gzip_vary on 需关闭以防 CDN 回源率升高。

phpEnv 是 Windows 下的集成环境,底层用的是 Nginx + PHP-FPM,但它默认配置不启用 ETag,也不适配现代前端工程化缓存需求——直接开 etag on 反而容易引发缓存错乱或 CDN 回源冲突。
静态资源(JS/CSS/图片)必须禁用 ETag,改用 immutable 强缓存
phpEnv 默认把所有请求都扔给 PHP 处理(比如通过 try_files $uri @php),导致本该由 Nginx 直接服务的静态文件也被 PHP 中转。这会让 Nginx 无法基于文件元数据生成稳定 ETag,且 PHP 层面根本不会设置 Last-Modified 或 ETag 响应头。
- 先确保静态资源由 Nginx 直接响应:在 phpEnv 的 Nginx 配置中(通常是
C:\phpEnv\nginx\conf\vhosts\your-site.conf),找到location ~ \.(js|css|png|jpg|gif|ico|svg|woff2?|ttf|eot)$块,删掉里面可能存在的fastcgi_pass或try_files @php,只保留expires 1y;和add_header Cache-Control "public, immutable"; - 显式关闭 ETag:
etag off;—— 否则 Nginx 在代理模式下可能尝试对 PHP 返回的内容生成弱 ETag,但 PHP 没发Last-Modified,结果 ETag 值为空或不一致 - 确认构建产物文件名含内容 hash(如
app.a1b2c3.js),否则immutable失效,浏览器仍会发起条件请求
HTML 入口文件不能强缓存,必须靠 ETag 或 Last-Modified 协商
phpEnv 环境下,index.html 往往是 PHP 动态生成的(比如读取模板、注入变量),此时 Nginx 的 etag on 不起作用——它只对真实磁盘文件或带 Last-Modified 响应头的代理响应生效。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 若 HTML 是纯静态文件(即物理存在
C:\phpEnv\www\index.html),Nginx 默认已开启etag on,无需额外配置;但需确认没被etag off覆盖 - 若 HTML 由 PHP 输出,必须在 PHP 代码里手动加头:
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime(__DIR__ . '/index.html')) . ' GMT');(前提是 PHP 读的是真实文件) - 避免在 PHP 中用
header('ETag: "xxx"')同时又开启 Nginx 的etag on,二者冲突会导致 304 校验失败
phpEnv 的 Nginx 编译不含 ngx_http_etag_module,别折腾内容哈希 ETag
官方 phpEnv 打包的 Nginx 是精简版,没有第三方模块支持基于文件内容(MD5/SHA)生成 ETag。试图用 map + add_header 或 Lua 注入内容摘要,会触发同步文件读取,在 Windows 下尤其卡顿,且 phpEnv 不带 OpenResty。
立即学习“PHP免费学习笔记(深入)”;
- 不要写类似
add_header ETag "md5-$(md5sum $request_filename | cut -d' ' -f1)";这种伪代码——Nginx 不支持 shell 执行 - 不要尝试编译自定义模块:phpEnv 的 Nginx 依赖特定版本的 OpenSSL 和 zlib,替换二进制极易导致 SSL 或 gzip 失效
- 真正可控的做法只有两个:对带 hash 的静态资源关 ETag + 强缓存;对 HTML 保证
Last-Modified准确性
最易被忽略的一点:phpEnv 的 Nginx 默认开启 gzip_vary on,而 Vary: Accept-Encoding 会干扰 CDN 对 ETag 的匹配逻辑,导致回源率升高。上线前务必检查并注释掉这一行。


















