应配置http缓存头实现静态资源本地缓存:一、php脚本用header()设cache-control与expires;二、nginx中location匹配后缀并设expires 1y;三、apache启用mod_expires与mod_headers;四、thinkphp用中间件按content-type注入头;五、phpenv检查是否误交由php处理静态文件。

如果您在PHP项目中发现CSS、JS或图片等静态资源反复被浏览器重新下载,导致页面加载变慢、服务器压力上升,则可能是HTTP缓存头未正确配置。以下是实现静态资源本地缓存的多种配置方法:
一、通过PHP脚本动态设置Cache-Control与Expires头
该方式适用于需对特定响应(如生成式静态文件、带参数的资源URL)实施运行时缓存控制的场景,由PHP在输出前直接发送标准HTTP缓存头,确保客户端可识别并执行缓存策略。
1、在输出静态内容前,调用header()函数设置强缓存指令:header("Cache-Control: public, max-age=31536000, immutable");
2、补充兼容性Expires头,避免老旧客户端忽略max-age:header("Expires: " . gmdate("D, d M Y H:i:s", time() + 31536000) . " GMT");
3、若资源含哈希指纹(如app.a1b2c3.js),必须添加immutable;若无哈希(如main.css),改用:header("Cache-Control: public, max-age=3600, must-revalidate");
4、禁止在header()调用后有任何输出(包括空格、BOM、echo),否则将触发“headers already sent”错误。
二、在Nginx中为静态资源直出配置缓存头
该方式效率最高,因Nginx在不经过PHP-FPM的情况下直接响应静态请求,避免进程启动开销,同时支持精准ETag/Last-Modified生成及CDN友好缓存指令。
1、编辑站点配置文件(如/etc/nginx/sites-available/default),在server块内、root指令同级位置添加location规则。
2、插入匹配静态后缀的location块,且必须置于PHP处理规则之前:location ~* \.(js|css|png|jpg|gif|woff2|ttf|eot|svg|webp)$ {
3、强制Nginx直出并跳过PHP处理:try_files $uri =404;
4、设置高效缓存头:expires 1y; 与 add_header Cache-Control "public, max-age=31536000, immutable";
5、确认该location未被location /内的fastcgi_pass或proxy_pass覆盖,可通过nginx -t验证配置语法。
三、在Apache中通过mod_expires与mod_headers配置缓存
该方式适用于phpEnv默认启用Apache的Windows开发环境,依赖模块原生支持时间计算与条件头注入,无需修改PHP代码即可统一管控静态资源缓存行为。
1、打开phpenv\apache\conf\httpd.conf,取消以下两行注释:LoadModule expires_module modules/mod_expires.so 与 LoadModule headers_module modules/mod_headers.so
2、在虚拟主机或.htaccess中启用Expires引擎:ExpiresActive On
3、为常见静态类型设置长期缓存:ExpiresByType text/css "access plus 1 year"、ExpiresByType application/javascript "access plus 1 year"
4、补全Cache-Control头以支持immutable语义(需Apache 2.4.7+):Header set Cache-Control "public, max-age=31536000, immutable" "expr=%{CONTENT_TYPE} =~ m|^text/|^application/(javascript|font-woff)|i"
5、重启Apache服务使配置生效,并确认curl -I http://localhost/style.css返回含Cache-Control与Expires头。
四、在ThinkPHP框架中通过中间件统一注入缓存头
该方式将缓存逻辑解耦至中间件层,支持按路由、状态码、Content-Type等条件动态决策,适合中大型项目维持缓存策略一致性,避免控制器分散设置导致遗漏或冲突。
1、创建中间件类app/middleware/StaticCacheMiddleware.php,实现handle方法。
2、获取下游响应对象:$response = $next($request);
3、仅对200状态且Content-Type为静态类型(如text/css、application/javascript)的响应追加头:if ($response->getCode() === 200 && preg_match('/^(text\/css|application\/javascript|image\/)/i', $response->getHeader('Content-Type')[0] ?? '')) {
4、设置不可变缓存策略:$response->header('Cache-Control', 'public, max-age=31536000, immutable');
5、在app/middleware.php中注册该中间件,作用于['html', 'css', 'js', 'image']等资源路由组。
五、通过phpEnv图形界面辅助定位缓存失效原因
该方式不直接配置缓存,而是利用phpEnv内置工具快速识别静态资源是否被错误交由PHP处理,从而排除因Web服务器配置错位导致的缓存策略失效问题。
1、点击系统托盘phpEnv图标,选择「网站管理」,确认当前站点使用的是Apache还是Nginx引擎。
2、进入「配置文件」→「Web服务器配置」,检查是否存在针对.js、.css等后缀的location或FilesMatch规则。
3、若发现静态请求被重写至index.php(如RewriteRule ^(.*)$ index.php [QSA,L]未排除静态路径),则说明缓存头由PHP输出,无法享受Nginx/Apache直出性能。
4、在「日志」→「Web服务器错误日志」中搜索"primary script unknown"或"No input file specified",可定位因try_files缺失导致的PHP误接管请求。
5、使用「在线检测」功能访问http://127.0.0.1/test.css,查看响应头中X-Powered-By字段:若显示PHP/8.x.x,表明CSS正被PHP处理,需立即修正Web服务器配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











