如何在 PHP 文件中使用 etags?

Posted

技术标签:

【中文标题】如何在 PHP 文件中使用 etags?【英文标题】:How to use etags in a PHP file? 【发布时间】:2012-10-23 05:52:31 【问题描述】:

您如何在 php 文件中实现 etags?我要上传什么到服务器,我要在我的 PHP 文件中插入什么?

【问题讨论】:

【参考方案1】:

创建/编辑您的 .htaccess 文件并添加以下内容:

FileETag MTime Size

要么将以下内容放在函数中,要么将其放在需要 etags 处理的 PHP 文件的顶部:

<?php 
    $file = 'myfile.php';
    $last_modified_time = filemtime($file); 
    $etag = md5_file($file); 

    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
    header("Etag: $etag"); 

    if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
        trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)  
        header("HTTP/1.1 304 Not Modified"); 
    exit; 
 
?>

【讨论】:

我遇到过必须修剪 $_SERVER['HTTP_IF_NONE_MATCH'] 中周围的单引号/双引号的情况 @lordspace 是什么情况?是否导致脚本无法运行? 不记得我正在处理的确切产品,但是 etag 字符串是用双引号括起来的,所以我不得不使用 trim($etag, '"\''); 请注意,这基本上只有在 PHP 文件不包含任何其他文件时才有效。更新其他文件时,不会更改 ETag。 Etag 值必须包含引号,datatracker.ietf.org/doc/html/rfc7232#section-2.3【参考方案2】:

https://datatracker.ietf.org/doc/html/rfc7232#section-2.3对应的版本(必须引用etag值):

<?php
$file = __DIR__ . '/myfile.js';
$etag = '"' . filemtime($file) . '"';

// Use it if the file is changed more often than one time per second:
// $etag = '"' . md5_file($file) . '"';

header('Etag: ' . $etag);

$ifNoneMatch = array_map('trim', explode(',', trim($_SERVER['HTTP_IF_NONE_MATCH'])));
if (in_array($etag, $ifNoneMatch, true) || count($ifNoneMatch) == 1 && in_array('*', $ifNoneMatch, true)) 
    header('HTTP/1.1 304 Not Modified');
    exit;


print file_get_contents($file);

【讨论】:

以上是关于如何在 PHP 文件中使用 etags?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nginx 上配置 ETag

Youtube API V3 和 Etag

你知道 http 响应头中的 ETag 是如何生成的吗

如果 ETag 不匹配,如何使用 ETag 在插入时抛出异常(除非它是 *)

ETag 与标头过期

如何在 IIS 上为 text/html 页面使用 eTag