缓存1个多域的文件

时间:2012-04-11 20:31:06

标签: php caching cache-control

首先,我对标题感到抱歉。我找不到更好的。

我是一个由PHP脚本生成的图像文件。此脚本(图像)连接到数据库并将其引用URL保存在表中。 由于输出图像没有变化,我认为最好将其缓存。

但据我所知,如果我在每个页面上缓存1个文件(例如http://www.example.com/img.png.php),则浏览器会从缓存中读取它。它对我的剧本不利。因为在第一次调用时,它会保存引用URL并通过浏览器缓存。在接下来的电话中,在不同的网站(推荐人)上,将使用缓存版本,浏览器不会向服务器发送任何请求,最后引用网址不会保存在数据库中。

我可以对浏览器说,请为每个域缓存1份图像吗? 我的意思是:

  

http://wwww.abc.com/index.html发送请求以获取我的图片(脚本)

     

浏览器检查其缓存,但找不到它。所以从中得到它   服务器。和PHP脚本保存引荐来源网址。

     

用户转到ABC.COM的另一页。 (例如:http://wwww.abc.com/about.html)浏览器检查缓存,它找到了   它。因此,不向服务器发送请求以获取文件内容。   并且PHP脚本不会运行。

     

另一个网站(http://wwww.efg.com/index.html)发送请求以获取我的图片(脚本)   浏览器检查缓存,并且找不到它。所以发送文件请求   内容。和PHP脚本运行................................

有可能吗? (对不起长篇文章,有很多语法问题)

3 个答案:

答案 0 :(得分:1)

您可以使用重定向页面(未缓存)将引荐来源保存到您的数据库,然后重定向到缓存的图像。

这样你总能得到一个命中但实际的图像被缓存。

<小时/> 在您的HTML中,您可以使用:

<img src="/image.php">

image.php

<?php
    // save the referrer in here

    header('Location: /image.jpg');
?>

/image.jpg是您的实际图片(可以缓存)

答案 1 :(得分:1)

首先,考虑一下用户的体验:您是否真的需要为引用者功能增加页面加载时间?此外,您应该知道许多浏览器/隐私工具配置首先禁止或不发送Referer标题。

如果您确实希望每次都加载资源(JavaScript,样式表,图像......),则可以使用资源发送Cache-Control HTTP header以防止缓存。例如,要防止在使用Apache时referer.js进行缓存,请在同一目录中添加以下.htaccess文件(需要mod_header):

<FilesMatch "^referer\.js$">
Header set Cache-Control no-cache
</FilesMatch>

答案 2 :(得分:0)

似乎是一个反击,我是对的吗?

AFAIK你不能完全按照你所解释的那样做。

但是你总是可以在服务器端“缓存”一个图像,所以你不需要重绘它:

<?
/*
  do some stuff
*/
// send an image: the content-type first
header('Content-type: image/png');
// and the image
readfile('myImage.png');