我正在使用PHP解压缩我的静态Javascript和CSS文件。请求原始文件时,服务器会发送Last-Modified
和ETag
标头。我还没有用PHP发送它们。我还看到了使用Cache-control
和Expires
标题的建议以及一些我不记得的建议。
前两个是否足够?我想我可以很容易地用PHP获得最后修改日期,但是我如何生成ETag?
如果最好包含其他两个,那么将这些文件附加到其他文件(如图像)的最佳方法是什么?也许通过.htaccess
? (我无法直接访问服务器。)
答案 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)
请参阅:
基本上你想要:
通过版本控制,我的意思是代替:
<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
哪个会对你有所帮助。