代码之家  ›  专栏  ›  技术社区  ›  DisgruntledGoat

我应该使用哪个报头来提供静态内容?

  •  2
  • DisgruntledGoat  · 技术社区  · 15 年前

    我正在使用php gzip静态javascript和css文件。当请求原始文件时,服务器将发送 Last-Modified ETag 标题。我还没有用PHP发送这些文件。我也看到了一些建议 Cache-control Expires 还有一些我不记得的标题。

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

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Dan Beam    15 年前

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

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

    <?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
    

    但是要小心,您必须创建一个文件()的版本,每次更新该文件时都必须更改该版本。

        2
  •  1
  •   Community CDub    8 年前

    见:

    基本上你想:

    • 最小化发送的文件数量(通过组合它们、spriting等);
    • 缩小所有javascript文件;
    • gzip所有内容(正确支持它的浏览器);以及
    • 所有版本。

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

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

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

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

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

    imho这远远优于涉及ETags等的方法。

        3
  •  0
  •   filippo    15 年前

    Apache使用inode大小的时间戳作为etag,但是如果您有一个Web服务器集群,那么这就不起作用。在这种情况下,您可以使用URL大小时间戳的MD5。 More info in the Etag section here

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

        4
  •  0
  •   MarkR    15 年前

    为什么不直接使用Apache来服务静态请求呢?

    它可以压缩东西,也可以正确地设置标题,猜猜看,它还可以处理边缘情况。

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

    也就是说,并非所有的违约都是合理的。如果您的站点有多个Web服务器,并且在不经常更改的内容上设置一个“expires”头,那么您可能应该禁用etag,如果您希望客户机的缓存最有用,那么这是非常必要的。

    看看那些有点屈尊俯就的,

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

    这对你有帮助。