在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
谢谢大家!
答案 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