我有一个网站的部分,我想按照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合并顺序斜杠?
答案 0 :(得分:-1)
这似乎可以解决问题,至少对于匹配(我不是100%确定你甚至允许在重写规则中有空白的网址段,但这个正则表达式无论如何都做对了):
browse\/([^\/]*)\/?([^\/]*)\/?([^\/]*)\/?([^\/]*)
尝试here
你犯的关键错误在于你使用的方式?你让整个块都是可选的,所以它放弃了它们,你用不同的索引编写了你的匹配。我的正则表达式只使/
成为可选项,如果那里没有任何变量,则为所有其他变量创建一个零长度捕获组。