2

假设我有一个图片网址:-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>
}
4

1 回答 1

1

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

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

Accept: image/webp,*/*

但是如果你在浏览器中打开这个 URL,即使有相同Referer的 header,浏览器也会发送另一个带有 header的请求

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,因此浏览器立即认为它“过时”,直接打开图像时强制另一个请求。

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

于 2019-11-28T23:29:47.007 回答