我应该使用哪些标头来提供静态内容?

时间:2009-12-19 01:50:08

标签: php http .htaccess header

我正在使用PHP解压缩我的静态Javascript和CSS文件。请求原始文件时,服务器会发送Last-ModifiedETag标头。我还没有用PHP发送它们。我还看到了使用Cache-controlExpires标题的建议以及一些我不记得的建议。

前两个是否足够?我想我可以很容易地用PHP获得最后修改日期,但是我如何生成ETag?

如果最好包含其他两个,那么将这些文件附加到其他文件(如图像)的最佳方法是什么?也许通过.htaccess? (我无法直接访问服务器。)

4 个答案:

答案 0 :(得分:1)

对于ETag你可以使用任何值,但我更喜欢使用当前文件[s]的md5_file()sha1_file()作为内容的唯一标识符(不应该真的有那么多的冲突)。

在输出之前执行此操作。

<?php header( "Etag: " . sha1_file( basename( $_SERVER[ 'PHP_SELF' ] ) ) ); ?>

或者您可以让Apache在.htaccess中为您执行此操作(如果已启用,通常是这样):

# if we're clustered this will still be cool
FileETag MTime Size

如果你想设置一个很长的过期(虽然这有点危险),你也可以这样做:

# turn on far-future expiration dates
# to cache content longer (30 days)
ExpiresActive On
ExpiresDefault A2592000

但是要小心,你必须制作一个你每次更新文件时都必须更改的文件()版本。

答案 1 :(得分:1)

请参阅:

基本上你想要:

  • 最小化您发送的文件数量(通过组合它们,精灵等);
  • 缩小所有Javascript文件;
  • GZip所有内容(对于正确支持它的浏览器);和
  • 版本一切。

通过版本控制,我的意思是代替:

<img src="/images/logo.gif">

添加一些内容以表示“版本”,例如文件的mtime:

<img src="/images/logo.gif?1234568899">

将此与远期的Expires标头相结合,以便浏览器只请求文件一次。然后,当您希望浏览器获取新副本时,请更改版本号。

恕我直言,这远远优于涉及ETag等的方法。

答案 2 :(得分:0)

Apache使用inode-size-timestamp作为Etag,但是如果你有一个Web服务器集群则不起作用。在这种情况下,您可以使用url-size-timestamp的md5。 More info in the Etag section here

我建议不要计算整个文件的md5,因为这对于大文件(例如图像,音频,视频)来说可能很昂贵。

答案 3 :(得分:0)

为什么不直接使用Apache来提供静态请求?

它可以压缩内容,也可以正确设置标题,猜猜是什么,它也处理边缘情况。

正确处理条件请求并不明显,我认为您不应该尝试这样做。使用已经执行此操作的Web服务器。

尽管如此,并非所有默认值都有意义。如果您的站点有多个Web服务器,并且在不经常更改的内容上设置“Expires”标头,那么您可能应该禁用ETag,如果您希望客户端的缓存最有用的话,那么这几乎是必须的。

看看有点居高临下,

http://developer.yahoo.com/performance/rules.html

哪个会对你有所帮助。