Apache RewriteRule:可以“检测”第一个和第二个路径段吗?

时间:2010-03-25 10:04:08

标签: regex apache mod-rewrite url-rewriting

我真的是regexp中的新手,我无法弄清楚如何做到这一点。

我的目标是让RewriteRule将请求网址路径分为3个部分:

example.com/foo
#should return: index.php?a=foo&b=&c=

example.com/foo/bar
#should return: index.php?a=foo&b=bar&c=

example.com/foo/bar/baz
#should return: index.php?a=foo&b=bar&c=baz

example.com/foo/bar/baz/bee
#should return: index.php?a=foo&b=bar&c=baz/bee

example.com/foo/bar/baz/bee/apple
#should return: index.php?a=foo&b=bar&c=baz/bee/apple

example.com/foo/bar/baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters
#should return: index.php?a=foo&b=bar&c=baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters

简而言之,网址路径中的第一个分段(foo)应该提供给 a ,第二个分段(bar)应该提供给 b ,以及 c

中其余字符串

我想这个

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(([a-z0-9/]))?(([a-z0-9/]+))?(([a-z0-9]+))(.*)$ index.php?a=$1&b=$2&c=$3 [L,QSA]
</IfModule>

但显然不起作用,我甚至不知道我想要的是否可能。

有什么建议吗?

修改 在与教练经理一起训练之后,我也得到了这个:

RewriteRule ^([^/]*)?/?([^/]*)?/?(.*)?$ index.php?a=$1&b=$2&c=$3 [L,QSA]

2 个答案:

答案 0 :(得分:1)

我可能会使用此规则(与您的规则类似):

RewriteRule ^([^/]+)?/?([^/]+)?/?(.*) index.php?a=$1&b=$2&c=$3 [L,QSA]

如果您不想允许尾部斜杠,可以使用此规则删除它们:

RewriteRule (.*)/$ /$1 [L,R=301]

答案 1 :(得分:0)

这个怎么样:

RewriteRule ^/([a-z0-9]+?)(?:/([a-z0-9]+?)){0,1}(?:/(.*)){0,1}$ [L,QSA]

我注意到你的正则表达式存在以下问题:

  • 在你的第一个小组中,你只是在寻找第一个字符 - 字符组后面的+符号表示只要有至少一个字符就可以匹配任意数量的字符组。

    < / LI>
  • 您只需要一组括号来匹配子表达式

  • ?运算符(这是为了让匹配变得懒惰吗?)应该在重复运算符之后直接运行(+)

  • 我还认为请求URI以/开头,而你的正则表达式中缺少

  • 您选择的论坛2和3的语法不太正确(?:stuff here){0,1}表示可能会出现“此处的内容”或者可能不会

我在一个名为The Regex Coach的优秀程序中对此进行了测试,该程序提供了以下内容

/foo (or /foo/) = index.php?a=foo&b=&c=
/foo/bar (or /foo/bar/) = index.php?a=foo&b=bar&c=
/foo/bar/any/number/of/other/parameters/after/the/third/one = index.php?a=foo&b=bar&c=any/number/of/other/parameters/after/the/third/one