Regex mod_重写正则表达式忽略空匹配

Regex mod_重写正则表达式忽略空匹配,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我想通过URL中传递的4个筛选条件浏览网站的某个部分: http://site/browse/a/b/c/d 4个参数中的每一个都应该是可选的。 我有这个修改规则: RewriteRule ^browse(/([^/]*)(/([^/]*)(/([^/]*)(/([^/]*))?)?)?)? /photo.php?a=$2&b=$4&c=$6&d=$8 [L] 如果我有全部4个参数,或者省略后面的参数,则效果很好,但如果我尝试跳过第一个参数,则会出现意外行为: htt

我想通过URL中传递的4个筛选条件浏览网站的某个部分:

http://site/browse/a/b/c/d
4个参数中的每一个都应该是可选的。 我有这个修改规则:

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 重新写入规则^photo/browse.*与browse/4匹配,而不是预期的browse///4。
我想问题应该是如何阻止mod_rewrite将连续的斜杠合并为一个?

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

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


你犯的主要错误是你使用的方式?。您将整个块设置为可选的,因此它会删除它们,并使用不同的索引进行匹配。我的正则表达式只将/设置为可选,如果没有任何变量,则会导致所有其他变量的捕获组长度为零。

正则表达式在mod_rewrite中的行为是意外的。如果在.htaccess中尝试正则表达式,它仍然会给出相同的行为:http://site/browse///c/d/e/f/g 匹配$1=c、$2=d等。问题集中在顺序斜杠被静默忽略并视为单个斜杠。我无法在其他正则表达式环境中复制此行为,例如在fiddle或PHP中。