使用Mod_Rewrite与图像URL参数

时间:2016-10-08 21:27:51

标签: php apache .htaccess mod-rewrite

我正在使用脚本通过URL动态地为图像添加水印。

例如:http://example.com/watermark.php?filename=assets/img/temp/temp_share.jpg会导致temp_share.jpg在新图片上显示水印。

我尝试使用mod_rewrite将网址清理为http://example.com/filename/assets/img/temp/temp_share.jpg

我在this site使用了生成器,它给了我RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L]

但是当我尝试转到http://example.com/filename/assets/img/temp/temp_share.jpg时,我收到错误Not Found The requested URL /filename/assets/img/temp/temp_share.jpg was not found on this server.

我不确定自己做错了什么。

我的.htaccess的全部内容

ErrorDocument 400 /err.php?err=400
ErrorDocument 401 /err.php?err=401
ErrorDocument 403 /err.php?err=403
ErrorDocument 404 /err.php?err=404
ErrorDocument 500 /err.php?err=500
ErrorDocument 502 /err.php?err=502
ErrorDocument 504 /err.php?err=504

Options -MultiViews
RewriteEngine On
RewriteBase /

RewriteRule assets/styles/style.css assets/styles/style.php [L]
RewriteRule assets/styles/m.style.css assets/styles/m.style.php [L]

RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L]

<FilesMatch ".(jpg|png|gif|jpeg)$">
ErrorDocument 404 error/stormtrooperBrokenImage.jpg
</FilesMatch>

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://lucycypher.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>

watermark.php的内容:

$imgpath=$_REQUEST['filename'];
header('content-type: image/jpeg'); 
$watermarkfile="assets/img/logo_variations/logo_watermark_75.png";
$watermark = imagecreatefrompng($watermarkfile);
list($watermark_width,$watermark_height) = getimagesize($watermarkfile);
$image = imagecreatefromjpeg($imgpath);
$size = getimagesize($imgpath);
$dest_x = ($size[0] - $watermark_width)/2;
$dest_y = ($size[1] - $watermark_height)/2;
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);

1 个答案:

答案 0 :(得分:2)

[^/] /

以外的所有字符的字符类

由于您的文件名确实包含/您需要捕获“filename /”标记之后的所有字符。尝试将其更改为此。

RewriteRule ^filename/(.*)$ /watermark.php?filename=$1 [L]

在检查您的重写模块已启用并且您已重新启动服务器之后,如果它仍然不起作用,您应该考虑对日志文件启用详细重写调试。

您还应该考虑在图像路径上添加额外的安全检查。有人可以很容易地使用../../../sensitive_uploads/1.jpg之类的东西来操作文件名参数,以导航到图像目录之外的某个位置。