【问题标题】:PHP - Check if an image loaded inside img src or directly inside browser?PHP - 检查图像是在 img src 中还是直接在浏览器中加载?
【发布时间】:2019-10-01 02:01:48
【问题描述】:

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

【问题讨论】:

  • 那是因为上面的 giphy-link 实际上并不是图片的链接。它是一个页面的链接。以上图片真实链接为i.giphy.com/media/N8Lfh9gWcWYIU/giphy.webp,可直接访问。
  • 此外,发布示例链接并不能真正回答“我为什么需要这个”。而是“我想要什么”
  • @MagnusEriksson 我知道 i.giphy.com/media/N8Lfh9gWcWYIU/giphy.webp 是真实的图片网址,但我也可以在 img src 属性中传递 media3.giphy.com/media/N8Lfh9gWcWYIU/giphy.gif 并且它可以正常工作 - 如何如果它不是图像,它可以工作吗?
  • @MagnusEriksson 你能进一步解释一下吗?使用wget时,只下载图片,无标记
  • @Magnus Eriksson 不正确。服务器可能根据Accept请求标头回复图像或302重定向。

标签: php giphy


【解决方案1】:

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

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

Accept: image/webp,*/*

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2016-03-28
    • 1970-01-01
    • 2022-11-10
    • 2015-10-30
    • 2019-08-24
    相关资源
    最近更新 更多