使用PHP和Apache设置HTTP过期头

62
如何在PHP + Apache中设置过期标头?我目前使用auto_prepend来提供gzip压缩的资源,但我也想最大化HTTP缓存。如何设置这些?
3个回答

132

有两种方法可以实现这一点。第一种是在您的php代码中指定标题。如果您希望以编程方式调整到期时间,这非常好。例如,维基百科可以为不经常编辑的页面设置更长的过期时间。

header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60))); // 1 hour

您的第二个选择是创建一个.htaccess文件或修改您的httpd配置。在共享托管环境中,修改您的.htaccess文件是非常常见的。为了做到这一点,您需要知道您的服务器是否支持mod_expiresmod_headers或两者都支持。最简单的方法是尝试和错误,但有些Apache服务器被配置为让您通过/server-info页面查看此信息。如果您的服务器同时拥有mod_expires和mod_headers,并且您想设置静态资源的到期时间,请尝试将以下内容放入您的.htaccess文件中:
# Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0

# Set up caching on media files for 1 year (forever?)
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A29030400
Header append Cache-Control "public"
</FilesMatch>

有关其他组合和更多示例,请参见:http://www.askapache.com/htaccess/speed-up-your-site-with-caching-and-cache-control.html


所以我想说,.flv、.ico等文件会自动添加正确的标头,是吗?非常酷。 - Tom
3
这行代码让服务器出现了500内部错误。建议检查一下该行代码是否存在语法或拼写错误。 - codingbbq
@noobcode 我有完全相同的问题。你是如何解决的?请告诉我。 - Houman
要使用“Header”,您需要mod_headers。例如运行“a2enmod”并键入“headers”,然后重新启动Apache。 - NateS
很好的回答。但是不要超过1年,因为这违反了RFC指南。 - Hannes Schneidermayer
2
请注意,您可以使用 gmdate('r'),该函数提供有效的RFC 2822表示形式。 - BenMorel

2

3
在使用 PHP 替代方案之前,我建议您先考虑使用 mod_expires。 - joebert

1

你试过类似的东西吗?

<?php
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接