如何创建一个PHP代码,例如处理ID并返回相应的图像,而不为客户提供实际的图像热链接。
如下面的链接所示,图片显示在html页面中,但热门链接对客户端隐藏。即使在新窗口中打开图像,也会显示相同的链接,而不是图像的原始链接。
这绝对没有在.htaccess文件中实现,因为每个图像网址都会显示id对应的图像,而不是重定向到单个页面。
答案 0 :(得分:3)
基本方式可能是这样的
<?php
// query to database mabye?
$myPath = getImagePath($_GET['id']);
// what kind of image file is that?
$contentType = getContentType($myPath);
// read file content
$img = file_get_contents($myPath);
// here you tell the browser what kind of image is that e.g. jpeg,png,gif...
header("Content-Type: $contentType");
echo $img;
?>
您需要根据需要定义getImagePath
和getContentType
功能。
答案 1 :(得分:1)
每当冲浪者进入我的某个网站时,我总是给他分配一个会话。会话中包含几个信息,例如:代理,IP,语言,日期......等,并通过cookie或GET(作为我的每个页面的参数)传递。
由于我处理了大量图像内容,因此我开始对数据集进行数据处理。这基本上意味着,为了管理和群集的目的,我将所有图像保存到多宿主的SQL数据库,并在多个服务器上传播。有人可能会说,如果这是明智之举,但我们可以在另一天和另一篇文章中争辩说。
我写了一个在我的网站上使用的小脚本:
<img src="http://example.com/display.php?id=34" border="0" alt="" />
当然,ID会不断变化。这是在数据库中引用我的图像的部分。 以下是我用来从数据库中检索图像的脚本代码:
<?php
$connection=@mysql_connect(...);
@mysql_select_db(...);
$query="SELECT mime, file FROM images
WHERE id=".$_GET["id"];
$rawdb=@mysql_query ($query,$connection);
if($rawdb AND @mysql_num_rows($rawd-->0){
$array=@ mysql_fetch_array($result);
if (!empty($array["fileContents"])){
// Output the MIME header
header("Content-Type: ".$array["mime"]}");
// Output the image
echo $array["file"];
}else{
// something else...
}
@mysql_free_result($rawdb);
}else{
// something else...
}
@mysql_close($connection);
?>
由于我已经为每个访问我网站的用户设置了会话,因此我添加了以下内容:
<img src="http://example.com/display.php?id=34&sid=383829" border="0" alt="" />
在脚本本身中实现一个小会话检查:
<!--
session_start();
if($_SESSION["is_known"]){
// do database calls
}else{
header("Location:http://mydomain.tld/dontsteal.html");
}
-->
我的方法的主要优点是,会话完全是服务器端。用户无法摆脱它,或伪造信息。由于我有一个超时并保存所有必要的信息(IP!)来验证,它看起来非常完美,适合我的需要。
这里的一个挫折是资源和性能。但既然我没有强迫你,你可以测试和评估。希望有所帮助!
答案 2 :(得分:0)
创建一个php脚本,在img标记中用作src。
在该脚本中,使用file_get_contents
从图像中获取数据。然后使用正确的mime类型发送标头。例如header('Content-type: image/jpeg');
然后输出数据。