重定向到动态图像隐藏其在PHP中的路径

时间:2013-11-07 20:23:36

标签: php .htaccess redirect

在PHP中,我有一个接收GET变量的脚本,在数据库中查找一些值并将用户重定向到动态(PNG)图像。 以下是示例步骤:

用户拨打地址“http://www.example.com/image/50

“.htaccess”文件中的RewriteRule将浏览器重定向到脚本“callImage.php?id = 50”

脚本“callImage.php”的内容:

[...]
<?php
$id = $_GET["id"];

$a = pickFromDB("a"); // $a = "Hello"
$b = pickFromDB("b"); // $b = "World"

header("Location: dynamicImage.php?a=".$a."&b=".$b); ?>

结果:用户被重定向到脚本“dynamicImage.php”,该脚本通过$ _GET数组获取两个变量并生成PNG图像。 唯一的问题是,在这些步骤之后,用户将在其浏览器的地址栏中看到“dynamicImage”脚本的完整地址:

http://example.com/dynamicImage.php?a=Hello&b=World

..虽然我想隐藏最后一个脚本的地址,但仍保持显示原始的“友好”地址:

http://www.example.com/image/50

有可能吗? 谢谢!

修改 我更新了“header()”语句......它缺少关键字“Location:...”:D

更新2 我还在“callImage.php”脚本中尝试了以下内容:

[...]

    header('Content-type: image/png');
    $url = "http://example.com/dynamicImage.php?a=Hello&b=World";
    $img = imagecreatefrompng($url);
    imagepng($img);
    imagedestroy($img);

...但浏览器无法显示它,因为“它包含错误”。我确定文件格式是PNG,因为在“dynamicImage.php”脚本中,我用来生成图像的语句是“imagepng()”。 奇怪的是,如果我将$ url完整地址放在地址栏中并按ENTER键,浏览器会正确显示图像!出了什么问题? PHP在开玩笑吧!

更新3

好的,我注意到“UPDATE 2”代码完美无缺。它之前没有用,因为在我的$ url中有一个空格,所以即使浏览器接受带空格的URL,“imagefrompng()”函数也没有,产生错误。

现在“callImage.php”脚本生成图像本身,因此地址栏中就有了 http://example.com/image/50

谢谢大家!

1 个答案:

答案 0 :(得分:0)

我正在为我的某个网站上的缩略图做类似的事情。基本前提是使用htaccess重写URL,然后PHP使用curl抓取正确的图像并将其发送到浏览器 - 您需要发送正确的内容类型,在我的情况下总是PNG,但您应该能够如果使用可变图像类型,则检测并发送正确的值。

尝试更新您的页面/变量名称,原谅任何错误。这应该导致http://example.com/image/50保留在地址栏中并根据动态查询显示正确的图像。只要服务器可以加载URL,就可以用于远程和本地映像。

<强>的.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteRule ^image/(\d*)$ /callImage.php?id=$1 [L,QSA]
</IfModule>

<强> callImage.php

// Do your database calls, etc and create the image URL
$image_url = "http://example.com/dynamicImage.php?a={$a}&b={$b}";

// Use curl to fetch and resend the image
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $image_url);     // Set the URL
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);   // Short timeout (local)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // Return the output (Default on PHP 5.1.3+)
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);   // Fetch the image as binary data

// Fetch the image
$image_string = curl_exec($ch);                // Even though it's binary it's still a "string"

curl_close($ch);                               // Close connection

$image = imagecreatefromstring($image_string); // Create an image object

header("Content-type: image/png");             // Set the content type (or you will get ascii)
imagepng($image);                              // Or imagejpeg(), imagegif(), etc
imagedestroy($image);                          // Free up the memory used by the image
die();                                         // All done