【问题标题】:Lighttpd URL rewrite with negative matching带有负匹配的 Lighttpd URL 重写
【发布时间】:2012-08-21 17:17:26
【问题描述】:

我正在尝试重写其中包含图像但没有“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"
)

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: regex mod-rewrite url-rewriting lighttpd


    【解决方案1】:

    这应该可以帮助您入门。如果\w+\.(jpg|jpeg|png|gif) 后面有字符串\.php,它将失败匹配

    模式:(?<!.*\.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。如果没有这个,我不知道您是否可以在纯正则表达式中编写“当 ABC 不在其后面的字符串中时匹配 XYZ”。也许比我有更多正则表达式的人知道方法。

    作为一种不太通用的解决方案,这将仅检查固定字符串 .php?image= 没有出现在图像名称之前:

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

    替换:viewing.php?image=$1

    【讨论】:

    • 感谢您的回答,但它似乎对我不起作用。它不会重写domain.com/trees.jpg,我只是得到一个 404。
    • 我在 .NET 正则表达式中对其进行了测试,也许您的环境没有相同的功能集。你是说对 domain.com/trees.jpg 的比赛完全失败了?
    • 是的,我也在gskinner.com/RegExr 进行了测试,它与 domain.com/trees.jpg 的任何部分都不匹配。
    • 我明白了。我正在使用可变大小的lookbehind,它显然只在.NET 和JGsoft 中受支持。 regular-expressions.info/lookaround.html让我看看能不能改。
    • 非常感谢您的帮助,效果很好。但是 '=' 之前的 'image' 字符串并不总是相同的,所以我将其更改为这个,它就像一个魅力: (?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多