PHP-检查图像是否加载在img src内或直接在浏览器内?

时间:2019-05-14 05:43:57

标签: php giphy

假设我有一个图片网址:-example.com/myimg.png

我想检查它是否包含在img src中或有人通过浏览器直接打开了它。

我需要什么:- 查看GIPHY的这张图片-https://media3.giphy.com/media/N8Lfh9gWcWYIU/giphy.gif

如果直接在浏览器中打开它,则它在图像的顶部和底部包含链接,但是如果将此图像包含在img src中,则它仅显示图像。

我尝试了以下代码,但这不是可靠的解决方案:-

$ref = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER']: "";
if ($ref != "")
{
    header( 'Content-Type: image/jpeg' );
    readfile( 'my-image.jpg' );
}
else
{
  <img src="my-image.jpg">
  <a href="#">My Link</a>
}

1 个答案:

答案 0 :(得分:1)

TL; DR giphy分析Accept HTTP标头,并使用大于Age:值的Cache-Control: max-age=标头值

当浏览器在<img>标签中加载图片时,它会发送特定的Accept标头。例如,Firefox 71.0b12将使用

Accept: image/webp,*/*

但是,即使您使用相同的Referer标头在浏览器中打开此URL,浏览器也会发送带有标头的另一个请求

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

但是还有更多。由于缓存,浏览器将不会发送其他请求。

为避免这种情况,giphy将使用以下标头进行回复:

Last-Modified: ...
Etag: "..."
Content-Type: image/gif
Cache-Control: max-age=86400
Age: 99360

(省略其他标题,不保留顺序)

如您所见, Age大于max-age ,因此浏览器立即将其视为“陈旧的” ,迫使另一个直接打开图像时要求。

请注意,此方法可能不适用于所有浏览器。