2009-12-19 140 views
2

我使用PHP来压缩我的静态Javascript和CSS文件。当请求原始文件时,服务器将发送Last-ModifiedETag标题。我还没有用PHP发送这些信息。我也看到了使用Cache-controlExpires标题的建议以及一些我不记得的内容。我应该使用哪些标头来提供静态内容?

那前两个就够了吗?我想我可以很容易地使用PHP获取最后修改日期,但是如何生成ETag?

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

+2

为什么如果它们是静态的,使用PHP进行gzipping?为什么不gzip他们一次,让Apache服务他们?或者使用mod_deflate ... – mopoke 2009-12-19 01:53:01

+0

因为1)并非所有浏览器都支持gzip(正确),并且2)谁需要额外的构建/部署步骤? – cletus 2009-12-19 02:44:42

+0

我可以指定要从'.htaccess'文件中压缩/缩小的文件吗?这会更快吗? – DisgruntledGoat 2009-12-19 20:22:22

回答

1

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

在任何输出之前执行此操作。

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

,或者你可以让阿帕奇为你做它在.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 

但要小心,你将不得不作出一个版本,你必须改变你每次更新文件时,该文件()的。

+0

我可以只为图像做这个吗?也许使用''指令?你怎么生成代码'A2592000'? – DisgruntledGoat 2009-12-19 20:16:47

+0

你可以只为图像做这个,查看apache命令ExpiresByType(例如,你可以做image/jpeg)。因此,您的mime文件中的任何类型(通常是image/png,image/gif,image/jpeg)都可以设置为此。你也可以在这个命令上做到这一点,我想,但按类型看起来像是一个更好的解决方案(如果你使用PHP图像?)。 A2592000是30天内的秒数(做数学或相信我,:P) – 2009-12-20 20:00:16

+0

确定获得数字,2592000,为什么'A'在前面?这是指定单位还是什么? – DisgruntledGoat 2009-12-29 17:54:12

1

参见:

基本上你想:

  • 最小化您发送(通过将它们结合起来,拼合等)的文件数量;
  • 最小化所有Javascript文件;
  • GZip的一切(对正确支持它的浏览器);和
  • 版本的一切。

通过版本控制我的意思,而不是:

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

添加一些东西来表示一个“版本”之类的文件的修改时间:

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

与遥远的未来结合这Expires头所以浏览器只会请求一次文件。然后,当您希望浏览器获得新副本时,您可以更改版本号。

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

+0

感谢您的提示。有没有办法在当前日期之后的几个月内自动设置过期标题?看起来我可以在htaccess中使用'Header set Expires'Thu,15 Apr 2010 20:00:00 GMT'',但是当那天接近时,我将不得不再提前几个月... – DisgruntledGoat 2009-12-29 18:16:01

0

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

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

0

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

它可以压缩的东西,以及正确设置标题,并猜测是什么,它也处理边缘情况。

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

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

看有点居高临下,

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

这将帮助你。

相关问题