Lighttpd URL重写与负匹配

时间:2012-08-21 17:17:27

标签: regex mod-rewrite url-rewriting lighttpd

我正在尝试重写其中包含图片而不是“php”的网址,例如:

我想匹配这个:

http://domain.com/trees.jpg

并将其重写为:

http://domain.com/viewimg.php?image=trees.jpg

但不符合这个:

http://domain.com/index.php?image=trees.jpg

因为它中有'php',所以它不应该对该URL进行任何重写。

我对正则表达式并不擅长,但我一直在尝试各种变体,但没有一个有效。 这是我尝试过的一种变体的例子:

url.rewrite-once = (
"(?!php\b)\b\w+\.(jpg|jpeg|png|gif)$" => "/viewimg.php?image=$1.$2"
)

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

这应该让你开始。如果\.php

后面有字符串\w+\.(jpg|jpeg|png|gif),则匹配失败

模式:(?<!.*\.php.*)\b(\w+\.(jpg|jpeg|png|gif))$

替换:viewing.php?image=$1

测试:

http://domain.com/trees.jpg  --->  http://domain.com/viewing.php?image=trees.jpg
http://domain.com/index.php/trees.jpg  ---> http://domain.com/index.php/trees.jpg
http://domain.com/index.php/image=trees.jpg  ---> http://domain.com/index.php/image=trees.jpg

修改

上面使用非恒定长度的lookbehind,显然是not supported on many platforms。如果没有这个,我不知道你是否可以在纯正则表达式中编写“匹配XYZ,当ABC在它背后的字符串中无处”时。也许比我更有正则表达能力的人知道一种方式。

作为一种不那么通用的解决方案,这只会检查固定字符串.php?image=是否在图像名称之前:

模式:(?<!\.php\?image=)\b(\w+\.(jpg|jpeg|png|gif))$

替换:viewing.php?image=$1