自动获取显示我的图片的网站的网址?

时间:2016-06-15 01:56:08

标签: php .htaccess http-headers bbcode hotlinking

我一直在尝试获取显示我的图片的网站的网址(包括GET参数)。这是因为我想提取URL的一个参数。

一位朋友告诉我她知道有人可以做到这一点,但我不知道他是不是用图像做的。另外我不认为我可以通过链接进行操作,因为当访问外部网站时,它会显示一个警告页面,表示您正被重定向到外面,所以如果我将链接添加到我的页面并且有人点击,我会得到重定向警告页面的引用URL。我不能保证我的朋友是否说出了这个真相,但这很可能是真的。

所有我能得到的图像是HTTP头的IP和其他东西,但是引用者部分是空的,我认为引用者包含我正在谈论的完整URL。

这是我尝试过的。 首先是BBCode中其他站点的img标签:

[img]http://______.com/get_image.php?i=myimage[/img]

在我的网站上用PHP编写这个脚本,虽然任何做这项工作的语言对我都有好处:

<?php
// Get name of image to be displayed (non-sanitized here for simplicity)
$filename = $_GET["i"];

// Here I want to get the site where image is being viewed
if (!empty($_SERVER['HTTP_REFERER'])) {
        $visitor_url = $_SERVER['HTTP_REFERER'];
} else {
        $visitor_url = "none";
}

// And write the referrer to a file just to test if it works
$fp = fopen('referer.txt', 'w');
fwrite($fp, $visitor_url);
fclose($fp);

// Eventually display the image
header('Content-Type: image/png');
readfile($filename . '.png');
?>

所以我的问题是:

  1. 是否可以获取显示我的图片的网站的完整网址?
  2. 如果没有,是否还有其他方法可以获取完整的网址?
  3. 提前谢谢。

    注意:我在发布图片的其他网站上没有任何权限,我只是那里的用户。请告诉我,如果我遗漏了某些东西,或者我不得不以另一种方式问这个问题,我是StackOverflow的新手。

4 个答案:

答案 0 :(得分:0)

尝试使用REMOTE_HOST代替HTTP_REFERER

// Here I want to get the site where image is being viewed
if (!empty($_SERVER['REMOTE_HOST'])) {
    $visitor_url = $_SERVER['REMOTE_HOST'];
} else {
    $visitor_url = "none";
}

需要正确配置要为图像提供服务的Web服务器。如果使用Apache,则使用HostNameLookups On

请参阅http://php.net/manual/en/reserved.variables.server.php

答案 1 :(得分:0)

通常,浏览器会发送包含查询参数 - $_GET参数的所有网址组件的完整引用。如果他们没有,那么在传递图像内容时没有其他方法可以实现该URL。

有时候发送引用可能会被阻止,例如。在一些批处理URL处理中使用一些爬虫程序/脚本或某些代理。

在PHP中,接收引用由$_SERVER['HTTP_REFERER']完成,因为它通常只是来自请求的http头,并且它是唯一具有引用信息的$_SERVER数组键。

答案 2 :(得分:0)

您添加了.htaccess标记,因此我认为您正在使用Apache Web服务器。如果您想完全阻止此问题,可以通过降低一层来完全禁用热链接。您可以将Web服务器配置为不向您托管的域以外的域提供内容,而不是使用PHP进行管理。

查看guide了解详情。

答案 3 :(得分:0)

我通过将我的网站(托管图片的位置)切换为 HTTPS 来解决此问题。我的问题中的代码正确地完成了它的工作。

看起来HTTP_REFERER是空白的,因为它来自HTTPS网站而我的网站是HTTP,它总是将其发送空白。我知道这可能是一个问题,但对我来说没有多大意义,因为当来自另一个HTTP站点时 HTTP_REFERER也是空白(我认为这不正常)所以我以为错误发生在另一个地方。

通常HTTP_REFERER会在发出时发送到:

  1. 从HTTP到HTTP
  2. 从HTTPS到HTTPS
  3. 从HTTP到HTTPS
  4. 但是当它来自并发送到时发送

    1. 从HTTPS到HTTP
    2. 在我的情况下,我不知道为什么,不是从HTTP发送到HTTP,这让我感到困惑。