我的最后一个问题是忙,所以我必须开一个新的。 (阅读我的上一个问题here)。
我试图将请求重定向到watermark.php
文件,以便在从我网站外部调用的图像中嵌入徽标。但是当我将此代码用于htaccess文件时:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !localhost [NC]
RewriteCond %{HTTP_REFERER} !friendlysite\.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteRule (.*) /watermark.php?pic=$1
和watermark.php的这些:
<?php
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('tbwm.png');
$im = imagecreatefromjpeg($_GET['pic']);
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
php文件只显示img文件的alt标记并返回此错误:
The requested URL /watermark.php was not found on this server.
当我直接打开watermark.php时,此错误返回:
The image http://192.168.1.190/hotlinking/watermark.php cont not be displayed because it contains errors.
问题是什么?
答案 0 :(得分:7)
你说过:/hotlinking/watermark.php
是你的文件路径,所以我认为你的重写必须是
RewriteRule (.*) /hotlinking/watermark.php?pic=$1
我认为您在直接访问
时出错http://192.168.1.190/hotlinking/watermark.php
因为您似乎没有传递pic参数。
顺便说一下:
a)我很确定你必须修改$ _GET ['pic']路径,否则函数imagecreatefromjpeg
将无法打开你的图片。
b)如果它不是jpeg,你将不得不用另一个函数修改它。在打开之前,您必须检查图像类型。
---更新---
好的RewriteRule是RewriteRule (.*) watermark.php?pic=$1
现在您已经请求了watermark.php文件。 您必须修改您的代码。 $ _GET ['pic']告诉你请求了什么图像路径。您必须修改此路径才能打开图像。
Watermark.php在根目录中,所以也许只有dirname(__FILE__) . $_GET['pic']
会这样做。
<?php
// Load the stamp and the photo to apply the watermark to
$filepath = dirname(__FILE__) . $_GET['pic'];
if ( file_exists($filepath) )
{
$infos = pathinfo($filepath);
$im = null;
switch($infos['extension'])
{
case 'jpg' :
case 'jpeg' :
$im = imagecreatefromjpeg($filepath);
break,
case 'png' :
$im = imagecreatefrompng($filepath);
// ....
}
if ( $im !== null )
{
$stamp = imagecreatefrompng('tbwm.png');
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
}
}
这不是完整的脚本,只是如何开始。你必须自己弄清楚其余部分。
答案 1 :(得分:1)
旁注: 您需要在输出图像之前检查图像是否存在,如果未找到则显示不同的图像。 e.g:
<?php
$pathToImage='./images/'.basename($_GET['pic']);
if(file_exists($pathToImage)==true){
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('tbwm.png');
$im = imagecreatefromjpeg($pathToImage);
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
}else{
header('Content-type: image/png');
readfile('notfound.png');
}
?>
回复评论:
您可以通过向imagepng添加文件名来缓存图像($ im,“new_image.png”);然后检查文件是否存在于后续页面加载中,这样就不会大大加快脚本速度,但会使用的磁盘空间增加一倍。