通过URL显示PHP图片

3

我有这段 PHP 代码(image.php):

if($_SERVER['SERVER_NAME'] == 'site.tld') {

    header('Content-type: image/jpeg');
    echo file_get_contents("image1.jpg");

} else {

    header('Content-type: image/jpeg');
    echo file_get_contents("image2.jpg");

}

这个页面(image.php)托管在site.tld上;

现在... 当<img src='http://site.tld/image.php' />调用时,将调用此代码。

如果在site.tld上调用图像,则我想显示image1.jpg,否则显示image2.jpg

该代码无论在哪个域名下调用,都会显示image1.jpg

有什么解决方案吗?谢谢。

编辑:无论在哪个网站上,$_SERVER['SERVER_NAME']的输出都是site.tld(我的服务器)......

这是问题所在,因为脚本不能正常工作。


你能发布一个 'error_log(print_r( $_SERVER, true ))' 吗? - ethrbunny
没有错误。问题在于代码始终显示image1.jpg,无论在哪个域名下调用代码。 - vlady
请展示一下 echo $_SERVER['SERVER_NAME'] 的结果并检查 if 条件。 - Mate
尝试使用函数:imagecreatefromjpeg - Adil
4个回答

4

试试这个:

    $imgPath = "image1.jpg";

    if(stripos($_SERVER["HTTP_REFERER"], 'http://site.tld/')=== false){

       $imgPath = "image2.jpg";

    }

    //echo $_SERVER["HTTP_REFERER"]."<br/>";
    //echo $imgPath."<br/>";

    header('Content-type: image/jpeg');
    echo file_get_contents($imgPath);

根据 PWhite 的评论,另一种选择:

您从 http://site.tld/ 进行的所有调用都会添加一个查询字符串键,并评估此数据。

在 site.tld 中:

<img src='http://site.tld/image.php?myfookey=secret' />

外部站点.tld:

<img src='http://site.tld/image.php' />

image.php

$imgPath = "image1.jpg";

if (!(isset($_REQUEST["myfookey"]) &&  $_REQUEST["myfookey"] == 'secret')){
    $imgPath = "image2.jpg";
} 

header('Content-type: image/jpeg');
echo file_get_contents($imgPath);

1
从PHP文档中:“页面的地址(如果有)是指引用户代理到当前页面的。这是由用户代理设置的。并非所有用户代理都会设置它,有些提供修改HTTP_REFERER的功能。简而言之,它不能真正被信任。” - Patrick White
是的,有类似的东西 :) 但是这个例子有一些错误。 有其他的选择吗? - vlady
不是指“物理”错误,而是一些“漏洞”。例如:从site2.tld:右键单击>查看图像,图像现在显示在site1.tld上,但保持不变。 - vlady
抱歉,我不太明白。如果您从Server site2.tld或site1.tld导航,则显示的图像是image2.jpg吗?请务必取消注释回显并检查是否有错误数据。 - Mate
我增加了另一种选择,请告诉我是否解决了@PWhite。 - Mate
这样做是可行的,但你的密钥必须是时间相关的,因为任何人都可以打开源代码并读取密钥 - 即图像文件的调用必须在页面打开的某个时间范围内完成。也许可以使用 image.php?key=1351134201.hash,其中哈希是时间的某个函数,并且图像文件检查时间是否在某个阈值内(比如一分钟),以及时间哈希是否正确。 - Patrick White

1

那是因为

$_SERVER['SERVER_NAME']

显示您的服务器名称(即执行PHP的服务器)。

您想要的是包含<img src='http://site.tld/image.php' />的页面的URL,我不确定客户端的浏览器是否会将此类信息发送到您的服务器。

/编辑:如果您想防止第三方网站显示您的图片,则应在服务器配置级别上执行该操作,例如http://www.davidairey.com/stop-image-theft-hotlinking-htaccess/


大多数情况下,它是 $_SERVER['HTTP_REFERER'],但这可以被欺骗。 - Patrick White
$_SERVER['SERVER_NAME'] 的输出是所有网站中的 site.tld (我的服务器)... 寻找一种使用图片获取当前URL的方法。 - vlady

0
首先,检查if条件中$_SERVER['SERVER_NAME']的输出。 然后使用readfile()代替file_get_contents()

$_SERVER['SERVER_NAME'] 的输出是 site.tld(我的服务器)在其他网站上... 这就是问题所在,因为脚本无法正常工作。 - vlady

0
如果您正在使用Apache,请尝试在虚拟主机配置中设置UseCanonicalName Off(可能需要重新加载/重启Apache)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接