mod_rewrite正则表达式忽略空匹配

时间:2016-03-14 12:20:26

标签: regex apache .htaccess mod-rewrite

我有一个网站的部分,我想按照URL中传递的4个过滤条件进行浏览:

http://site/browse/a/b/c/d

4个参数中的每一个都应该是可选的。 我有这个mod_rewrite规则:

RewriteRule ^browse(/([^/]*)(/([^/]*)(/([^/]*)(/([^/]*))?)?)?)? /photo.php?a=$2&b=$4&c=$6&d=$8 [L]

如果我有所有4个参数,或省略以后的参数,它可以正常工作,但如果我尝试跳过第一个参数,我会得到意外的行为:

http://site/browse/1/2/3/4 = /photo.php?a=1&b=2&c=3&d=4 [correct]
http://site/browse/1/2     = /photo.php?a=1&b=2         [correct]
http://site/browse//2/3/4  = /photo.php?a=2&b=3&c=4     [unexpected]
http://site/browse////4    = /photo.php?a=4             [unexpected]

它不是将空字符串作为第一个匹配项传递,而是完全忽略该匹配项,并将多个顺序斜杠视为一个,并将参数放入错误的变量中。如果我在空变量中放置任何非空占位符,它会起作用,但我宁愿不像那样处理它:

http://site/browse/-/-/-/4 = /photo.php?a=-&b=-&c=-&d=4 [works,not pretty]

如何修复我的正则表达式,以便http://site/browse////4给出/photo.php?a=&b=&c=&d=4

编辑:在另一项体验中,我发现多个斜杠始终合并,例如http://site/photo/browse////4合并到RewriteRule ^photo/(browse.*)匹配"浏览/ 4"不是"浏览//// 4"正如所料。 我想问题应该是如何阻止mod_rewrite合并顺序斜杠?

1 个答案:

答案 0 :(得分:-1)

这似乎可以解决问题,至少对于匹配(我不是100%确定你甚至允许在重写规则中有空白的网址段,但这个正则表达式无论如何都做对了):

browse\/([^\/]*)\/?([^\/]*)\/?([^\/]*)\/?([^\/]*)

尝试here

你犯的关键错误在于你使用的方式?你让整个块都是可选的,所以它放弃了它们,你用不同的索引编写了你的​​匹配。我的正则表达式只使/成为可选项,如果那里没有任何变量,则为所有其他变量创建一个零长度捕获组。