如何使用Zeus重写规则从URL路径获取最后一个目录?

时间:2012-04-01 07:00:34

标签: regex zeus

我需要一个正则表达式,它将返回路径中的最后一个目录。

例如,从www.domain.com/shop/widgets/返回“小部件”。

我的表达几乎可以奏效。

[^/].*/([^/]+)/?$ 

它会从www.domain.com/shop/widgets/返回“小部件”,但不会从www.domain.com/widgets/

返回

我还需要忽略包含文件名的任何网址。因此www.domain.com/shop/widgets/blue_widget.html将不匹配。

这必须使用正则表达式来完成,就像Zeus服务器请求重写模块一样。

4 个答案:

答案 0 :(得分:2)

/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/

这是做什么的?

  • 匹配域的普通文本。根据需要进行调整。
  • 匹配任意数量的目录,每个目录都包含非斜杠字符,后跟斜杠。
  • 匹配一串非斜杠。
  • 匹配输入末尾的斜杠,从而消除文件(因为只有目录以斜杠结尾)。

在Perl中实现:

[ghoti@pc ~] cat perltest
#!/usr/local/bin/perl

@test = (
        'www.example.com/path/to/file.html',
        'www.example.com/match/',
        'www.example.com/pages/match/',
        'www.example.com/pages/widgets/thingy/',
        'www.example.com/foo/bar/baz/',
);

foreach (@test) {
        $_ =~ m/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/i;
        printf(">> %-50s\t%s\n", $_, $2);
}

[ghoti@pc ~] ./perltest
>> www.example.com/path/to/file.html                    
>> www.example.com/match/                               match
>> www.example.com/pages/match/                         match
>> www.example.com/pages/widgets/thingy/                thingy
>> www.example.com/foo/bar/baz/                         baz
[ghoti@pc ~] 

答案 1 :(得分:1)

这通常应该有效:

/([^/.]+)/$

它匹配一个字符串倒数第二个斜杠之后的一组非斜杠非句点字符,该字符串必须以斜线结尾。

“文件夹名称”将位于第一个捕获组中。

答案 2 :(得分:1)

#!/usr/bin/perl

use strict;
use warnings;

$_ = 'www.domain.com/shop/widgets/';
print "$1\n" if (/\/([^\/]+)\/$/);

$_ = 'www.domain.com/shop/widgets/blue_widget.html';
print "$1\n" if (/\/([^\/]+)\/$/);'

答案 3 :(得分:0)

您不需要Perl正则表达式。你想要一个Zeus会理解的正则表达式。虽然他们可能会调用该PCRE,但PCRE也不会处理所有Perl正则表达式。

这里的大部分答案都是错误的,因为他们没有考虑您可以作为输入获得的不同种类的网址。

  • 只获取网址的路径部分
  • 与路径部分匹配以找到您需要的内容
  • 区分以文件名结尾的路径和不
  • 的路径

您可以将一些示例用作开头。我不使用Zeus并且不想,所以下一部分取决于你:

我已经读过您可以通过Perl Extensions for ZWS将请求传递给Perl程序,但如果您需要这样做,我会感到惊讶。如果你不得不诉诸于此,我将使用URI模块来解析URI并提取路径。完成后,将路径分成它的组件:

use URI;

my $uri = URI->new( ... ); # I don't know how Zeus passes data
my $path = $uri->path;

# undef to handle the leading /
my( undef, @parts ) = split $path, '/';

到目前为止,您必须决定如何将某些内容识别为目录。如果您直接映射到文件系统结构,那么只需在@parts之后弹出元素,直到找到目录,然后倒数想要跳过的数字。

但是,无论我在Perl程序中添加什么,我都会这么做。我首先尝试在Zeus规则中尽力完成它。告诉我们你到目前为止所拥有的。