【问题标题】:Specify a cache validator for images created by imagejpeg/imagepng functions为 imagejpeg/imagepng 函数创建的图像指定缓存验证器
【发布时间】:2017-08-26 19:02:05
【问题描述】:

我们都知道,我们可以通过在 .htaccess 文件中添加以下行来为图像指定缓存验证器:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 year"
</IfModule>

.. 和..

<IfModule mod_headers.c>
    <FilesMatch "\.(bmp|css|flv|gif|ico|jpg|jpeg|js|pdf|png|svg|swf|tif|tiff)$">
        Header set Last-Modified "Mon, 31 Aug 2009 00:00:00 GMT"
    </FilesMatch>
</IfModule>

但是,它对真正的 JPG 或 PNG 文件有效。然而,问题是,如何为使用 PHP 代码和 imagejpeg/imagepng 函数构建的图像指定缓存验证器? (以上代码对他们无效)

PS:我曾尝试使用 .htaccess 文件将 PHP 创建的图像的 URL 模拟为真实图像(例如:http://example.com/1.jpg,由 PHP 文件生成,不是真实的 .jpg 图像),但仍然收到缓存验证器警告。

【问题讨论】:

    标签: php .htaccess caching imagejpeg


    【解决方案1】:

    您可以在 imagejpeg/imagepng 函数之前添加 PHP 代码:

    function TestModifiedSince($PageTimeStamp, $TextDatePage) {
        if (isset($_SERVER["HTTP_CACHE_CONTROL"])) {return;}
        if (!isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {return;}
        $TestTime=strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]);
        if (($TestTime - $PageTimeStamp) >= 0) {
            header('Last-Modified: '. $TextDatePage, true, 304);
            exit();
        }
    }
    
    #                           hh  mm  ss  MM  DD  YYYY
    $DateUpdateBaseDef = mktime(00, 00, 00, 08, 31, 2009);
    $TimeHeadUpdate = gmdate('D, d M Y H:i:s', $DateUpdateBaseDef).' GMT';
    TestModifiedSince($DateUpdateBaseDef, $TimeHeadUpdate);
    

    【讨论】:

      【解决方案2】:

      我的想法,改变服务器配置,执行不同的扩展而不是只执行 PHP。当您使用带有 php 文件源的 img 标签来渲染图像时打印图像。使用不同的扩展名,例如 getimage.iphp。 在您的 .htaccess 设置中包含扩展名为 .iphp 的文件的缓存控制

      最后在图像生成函数中使用 header 来设置单个图像文件的到期时间。

      它的位理论,但作为实现的想法可能有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多