【问题标题】:Which headers should I use for serving static content?我应该使用哪些标头来提供静态内容?
【发布时间】:2009-12-19 01:50:08
【问题描述】:

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

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

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

【问题讨论】:

  • 如果 PHP 是静态的,你为什么要用 PHP 压缩?为什么不 gzip 一次并让 apache 为它们提供服务?或者使用 mod_deflate...
  • 因为 1) 并非所有浏览器都支持 gzipping(正确)和 2) 谁想要额外的构建/部署步骤?
  • 我可以从.htaccess 文件中指定要压缩/压缩的文件吗?那会更快吗?
  • 啊,找到了这个页面:askapache.com/htaccess/apache-speed-compression.html 目前似乎没有样式表,但我明白了它的要点。

标签: php http .htaccess header


【解决方案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

但请注意,您必须制作文件 () 的版本,每次更新文件时都必须更改该版本。

【讨论】:

  • 我可以只对图片执行此操作吗?也许使用&lt;Files&gt; 指令?以及如何生成代码A2592000
  • 您只能对图像执行此操作,查找 apache 命令 ExpiresByType(例如,您可以执行 image/jpeg)。因此,您的 mime 文件(通常是 image/png、image/gif、image/jpeg)中的任何类型都可以设置为此。我猜您也可以在 命令上执行此操作,但按类型对我来说似乎是一个更好的解决方案(如果您使用 PHP 图像怎么办?)。 A2592000 是 30 天内的秒数(算一算,或者相信我,:P)
  • OK 得到数字,2592000,为什么A 在前面?那是指定单位还是什么?
  • A 表示访问时间(您的浏览器上次使用它的时间)
【解决方案2】:

见:

基本上你想要:

  • 尽量减少您发送的文件数量(通过组合、精灵等);
  • 缩小所有 Javascript 文件;
  • GZip 一切(到正确支持它的浏览器);和
  • 版本所有。

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

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

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

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

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

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

【讨论】:

  • 感谢您的提示。有没有办法在当前日期后的几个月内自动设置过期标题?看起来我可以在 htaccess 中做Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT",但是当那一天临近时,我将不得不再次将它提前几个月......
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    为什么不直接使用 Apache 来处理静态请求?

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

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

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

    看有点居高临下,

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

    这对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多