.htaccess Rewriterule Regex仅适用于包含特定单词的文件

时间:2014-06-15 01:38:15

标签: php regex wordpress .htaccess

我的.htaccess文件中有以下代码,它为我的所有WordPress上传添加了水印。我试图找出如何更改正则表达式,使其仅适用于以特定文件名结尾的文件。

RewriteRule (.*)wp-content/uploads/(.*\.(jpe?g|gif|png))$ $1watermark.php?p=br&q=90&src=wp-content/uploads/$2

如果/ uploads /目录中的文件以示例结尾:ORIGINAL.jpg(完整文件名为sunset-ORIGINAL.jpg)或ORIGINAL.gif,我只想要那些应用了水印的文件。

这是我可以修改.htaccess重写规则,还是应该尝试在watermark.php文件中实现?

watermark.php的代码可以是found here&下面:

//we tell the server to treat this file as if it wore an image
header('Content-type: image/jpeg');
//image file path
$img = $_GET['src'];
//watermark position
$p = $_GET['p']; if(!$p) $p = 'br';
/*
p can be anything from the following list:
tl = top left
tc = top center
tr = top right
cl = center left
c = center of the image
cr = center right
bl = bottom left
bc = bottom center
br = bottom right
*/
//watermarked image quality
$q = $_GET['q'];
//if the quality field is missing or is not on the 0 to 100 scale then we set the quality to 93
if(!$q || $q<0 || $q>100) $q = '93';


$filetype = substr($img,strlen($img)-4,4);
$filetype = strtolower($filetype);
if($filetype == ".gif") $image = @imagecreatefromgif($img);
if($filetype == ".jpg") $image = @imagecreatefromjpeg($img);
if($filetype == ".png") $image = @imagecreatefrompng($img);
if (!$image) die();

//getting the image size for the original image
$img_w = imagesx($image);
$img_h = imagesy($image);
//if the filename has 150x150 in it's name then we don't apply the watermark
if (eregi("150x150", $img)) {
    imagejpeg($image, null, $q); die();
} else {
    $watermark = @imagecreatefrompng('watermark.png');
}
/*
//if you want to use the watermark only on bigger images then use this instead of the condition above
if ($img_w < "150") {//if image width is less then 150 pixels
    imagejpeg($image, null, $q); die();
} else {
    $watermark = @imagecreatefrompng('watermark.png');
}
*/

//getting the image size for the watermark
$w_w = imagesx($watermark);
$w_h = imagesy($watermark);

if($p == "tl") {
    $dest_x = 0;
    $dest_y = 0;
} elseif ($p == "tc") {
    $dest_x = ($img_w - $w_w)/2;
    $dest_y = 0;
} elseif ($p == "tr") {
    $dest_x = $img_w - $w_w;
    $dest_y = 0;
} elseif ($p == "cl") {
    $dest_x = 0;
    $dest_y = ($img_h - $w_h)/2;
} elseif ($p == "c") {
    $dest_x = ($img_w - $w_w)/2;
    $dest_y = ($img_h - $w_h)/2;
} elseif ($p == "cr") {
    $dest_x = $img_w - $w_w;
    $dest_y = ($img_h - $w_h)/2;
} elseif ($p == "bl") {
    $dest_x = 0;
    $dest_y = $img_h - $w_h;
} elseif ($p == "bc") {
    $dest_x = ($img_w - $w_w)/2;
    $dest_y = $img_h - $w_h;
} elseif ($p == "br") {
    $dest_x = $img_w - $w_w;
    $dest_y = $img_h - $w_h;
}

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $w_w, $w_h);
imagejpeg($image, null, $q);
imagedestroy($image);
imagedestroy($watermark);

1 个答案:

答案 0 :(得分:0)

  

这是我可以通过修改.htaccess重写规则来做的事情   或者我应该尝试在watermark.php文件中实现它?

从架构的角度来看,最好让RewriteRule动作调用watermark.php,然后将健壮性添加到watermark.php,以区分应该对哪些文件执行操作或忽略。< / p>

.htaccess&amp;同样酷的原因相关的RewriteRule逻辑是,它实际上应该仅用于将Web请求从一件事快速引导到另一件事。添加一层“这个文件是JPEG吗?好吧,这样做......“逻辑有点太多了。它可能已经完成,但实际情况是在一个PHP脚本中可以更好地处理它。

然后在PHP中,你可以添加你认为需要采取行动的最佳逻辑级别。

好的,看看你的代码,看看这些行:

$filetype = substr($img,strlen($img)-4,4);
$filetype = strtolower($filetype);
if($filetype == ".gif") $image = @imagecreatefromgif($img);
if($filetype == ".jpg") $image = @imagecreatefromjpeg($img);
if($filetype == ".png") $image = @imagecreatefrompng($img);
if (!$image) die();

$filetype基本上是文件扩展名,对吗?而且您只想对.gif.jpg&amp; .png个文件,对吗?看看这一行:

if (!$image) die();

处理它的逻辑已经存在。此脚本仅对.gif.jpg&amp; .png个文件,因此无需再为此做任何工作。

但我会说脚本中的逻辑可以改进,但这是另一个主题。按照目前的情况,您可以将非图像文件发送到此脚本,因为如果文件不是die().gif&amp; {},那么它只会.jpg。无论如何.png档。

编辑:好的,我在评论中看到您希望watermark.php脚本仅对名称末尾名称为ORIGINAL的文件执行操作。在延期之前,对吗?然后你可以像这样修改watermark.php。首先,找到这一行:

//image file path
$img = $_GET['src'];

然后添加一个正则表达式来检查ORIGINAL.gif&amp;末尾的.jpg。这样的.png个文件:

//image file path
$img = $_GET['src'];
// Check if the image has a '.gif', '.jpg' or '.png' extension.
preg_match('/(?:ORIGINAL)\.(gif|jpg|png)$/', $img, $matches);
if (empty($matches)) die();

那就是说,如果你问我这个watermark.php会有一个重大问题:它会影响GIF,JPEG&amp; PNG文件,最终产品都是JPEG文件,如上图所示:

header('Content-type: image/jpeg');

这一行位于底部:

imagejpeg($image, null, $q);
你确定要的吗?如果我是你,我会修改该代码,以便PNG保持PNG,GIF保持GIF,JPEG保持JPEG。但这超出了这个问题的范围。可以是一个很好的项目,你可以解决你也觉得需要重做。