GoDaddy主机上PHP设置Last-Modified Header无效问题求助
解决GoDaddy主机上PHP设置Last-Modified Header无效的问题
我通过PHP生成并发送.css文件,输出内容前设置了以下Header:
header('Accept-Ranges: bytes'); header('Content-Length: '.strlen($css)); header('Content-Type: text/css');
同时设置了Last-Modified Header:
$lastModified = gmdate('D, d M Y H:i:s T', filemtime($file)); header('Last-Modified: '.$lastModified);
这段代码在本地XAMPP服务器上运行正常,但在GoDaddy主机上,Last-Modified Header被忽略,始终显示当前时间(从截图可见,响应头里的Last-Modified字段为当前请求时间,而非设置的文件修改时间)。以下是可行的解决办法:
- 禁用GoDaddy的输出缓冲与压缩
GoDaddy默认开启的输出缓冲或Gzip压缩会覆盖自定义的Last-Modified头。可以在PHP代码开头添加:
@ini_set('zlib.output_compression', 0); @ini_set('output_buffering', 0); @ob_end_clean();
或者在网站根目录的.htaccess文件中添加:
SetEnv no-gzip 1 SetEnv dont-vary 1
- 调整Header设置顺序
把Last-Modified头放在所有Header的最前面发送,避免后续服务器处理覆盖它:
$lastModified = gmdate('D, d M Y H:i:s T', filemtime($file)); header('Last-Modified: '.$lastModified); header('Accept-Ranges: bytes'); header('Content-Length: '.strlen($css)); header('Content-Type: text/css');
验证文件路径与权限
确认$file变量指向的文件路径正确,且PHP进程能读取该文件的修改时间。可以用var_dump(filemtime($file))测试,若返回false,则需要修正文件路径或调整文件权限。补充ETag头并处理304状态
如果Last-Modified始终被覆盖,可同时设置ETag头增强缓存控制,还能处理客户端的缓存验证请求:
$lastModified = gmdate('D, d M Y H:i:s T', filemtime($file)); $etag = md5_file($file); // 处理缓存验证请求 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) { $clientEtag = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH'], '"') : ''; if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastModified || $clientEtag == $etag) { header('HTTP/1.1 304 Not Modified'); exit; } } // 设置响应头 header('Last-Modified: '.$lastModified); header('ETag: "'.$etag.'"'); header('Accept-Ranges: bytes'); header('Content-Length: '.strlen($css)); header('Content-Type: text/css');
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

