如何让输出Content-Type为text/css的PHP文件自动更新Last-Modified请求头,使其表现得像常规样式表文件一样?
如何让输出Content-Type为text/css的PHP文件自动更新Last-Modified请求头,使其表现得像常规样式表文件一样?
嘿,这个场景我太熟悉了!之前用PHP动态输出CSS的时候,也碰到过同样的问题——静态CSS文件服务器会自动处理Last-Modified头,但PHP生成的就不行,导致自动刷新的插件没法检测到变化。其实解决起来很简单,我们只需要手动在PHP里设置这个响应头就行,甚至还能顺便实现缓存优化,一举两得!
核心思路是这样的:我们需要先拿到你CSS内容对应的“最后修改时间”(不管是静态源文件的修改时间,还是动态内容最后更新的时间),然后把这个时间转换成HTTP标准格式,设置成Last-Modified响应头。另外,为了更高效,我们还可以处理浏览器发送的If-Modified-Since请求头,当内容没变化时直接返回304状态码,不用重复发送CSS内容。
给你一个实用的代码示例,假设你的PHP是基于某个静态CSS文件生成内容的(如果是完全动态生成的,后面我会说调整方法):
<?php // 替换成你的实际CSS源文件路径,或者动态内容的基准文件 $sourceFile = 'your-style-source.css'; $lastModifiedTime = filemtime($sourceFile); // 把修改时间转换成HTTP要求的GMT格式字符串 $httpModifiedDate = gmdate("D, d M Y H:i:s", $lastModifiedTime) . " GMT"; // 设置Last-Modified响应头 header("Last-Modified: " . $httpModifiedDate); // 检查浏览器的缓存时间,判断是否需要返回304(内容未修改) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $clientModifiedTime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); // 如果浏览器缓存的版本和当前文件修改时间一致,直接返回304 if ($clientModifiedTime >= $lastModifiedTime) { header("HTTP/1.1 304 Not Modified"); exit; } } // 设置正确的Content-Type头 header("Content-Type: text/css"); // 输出CSS内容,这里可以是读取文件或者动态生成的内容 readfile($sourceFile); ?>
如果你的CSS是完全动态生成的(比如从数据库拉取样式配置),那你需要自己维护一个“最后更新时间”——比如把每次修改配置的时间存在数据库里,或者写一个小的缓存文件记录最新修改时间,然后用这个时间来替换上面代码里的filemtime($sourceFile)就行。
这样处理之后,你的PHP生成的CSS文件就会和静态CSS文件一样,自动带上正确的Last-Modified头,你的JavaScript插件就能正常检测到文件变化,自动帮你刷新样式啦!
备注:内容来源于stack exchange,提问作者Ian Y.
相关产品推荐
相关产品推荐

