Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php .htaccess重写规则Regex以仅应用于其中包含特定单词的文件_Php_Regex_Wordpress_.htaccess - Fatal编程技术网

Php .htaccess重写规则Regex以仅应用于其中包含特定单词的文件

Php .htaccess重写规则Regex以仅应用于其中包含特定单词的文件,php,regex,wordpress,.htaccess,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 ORIGINA

我的
.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
的代码如下(&C):

//我们告诉服务器将此文件视为带有图像
标题(“内容类型:图像/jpeg”);
//图像文件路径
$img=$_GET['src'];
//水印位置
$p=$_GET['p'];如果(!$p)$p='br';
/*
p可以是以下列表中的任何内容:
tl=左上角
tc=上止点
tr=右上角
cl=中间偏左
c=图像的中心
cr=中间偏右
bl=左下角
bc=底部中心
br=右下角
*/
//水印图像质量
$q=$_GET['q'];
//如果质量字段缺失或不在0到100范围内,则我们将质量设置为93
如果(!$q | |$q100)$q='93';
$filetype=substr($img,strlen($img)-4,4);
$filetype=strtolower($filetype);
如果($filetype==“.gif”)$image=@imagecreatefromformgif($img);
如果($filetype==“.jpg”)$image=@imagecreatefromjpeg($img);
如果($filetype==“.png”)$image=@imagecreatefrompng($img);
如果(!$image)死亡();
//获取原始图像的图像大小
$img_w=imagesx($image);
$img_h=imagesy($image);
//如果文件名的名称中有150x150,则不应用水印
如果(埃雷吉(150x150美元,img)){
imagejpeg($image,null,$q);die();
}否则{
$watermark=@imagecreatefrompng('watermark.png');
}
/*
//如果只想在较大的图像上使用水印,请使用此选项,而不是上述条件
如果($img_w<“150”){//如果图像宽度小于150像素
imagejpeg($image,null,$q);die();
}否则{
$watermark=@imagecreatefrompng('watermark.png');
}
*/
//获取水印的图像大小
$w_w=imagesx($watermark);
$w_h=imagesy($watermark);
如果($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);
图像销毁($图像);
图像销毁(水印);
修改
.htaccess
重写规则是否可以做到这一点 或者我应该在
watermark.php
文件中实现它吗

从体系结构的角度来看,最好让
RewriteRule
在调用
watermark.php
时起作用,然后将健壮性添加到
watermark.php
中,以区分哪些文件应该被操作或忽略

.htaccess
相关的
重写规则
逻辑一样酷的原因是,它实际上应该只用于快速地将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
.png
文件进行操作,对吗?那么看这一行:

if (!$image) die();
//image file path
$img = $_GET['src'];
处理这个问题的逻辑已经存在。此脚本将仅作用于
.gif
.jpg
&
.png
文件,因此无需在这方面再做任何工作

但是我会说脚本中的逻辑可以改进,但这是一个完全不同的主题。目前,您可以将非图像文件发送到此脚本,因为如果该文件不是
.gif
.jpg
&
.png
文件,则它将消失()

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

if (!$image) die();
//image file path
$img = $_GET['src'];
然后在
.gif
.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和PNG文件时,最终产品都将是一个JPEG文件,如上图所示:

header('Content-type: image/jpeg');
下面这一行:

imagejpeg($image, null, $q);

你确定你想要吗?如果我是你,我会重新编写代码,使PNG保持PNG,GIF保持GIF,JPEG保持JPEG。但是这超出了这个问题的范围&这对你来说是一个很好的项目,你也觉得需要重新设计。

你能从
watermark.php
中发布一些代码来说明它是如何获得文件名的,然后做些什么的吗?或者,如果文件很小,只需发布完整内容。因此,您想查找以
原始文件结尾的文件吗