可选的RewriteRule参数

时间:2012-01-11 12:47:06

标签: apache .htaccess mod-rewrite

如何将这些RewriteRules组合成一行,每个参数都是可选的?

RewriteRule ^(.*)/(.*)/(.*)/(.*)/ index.php?_page=$1&_sub=$2&_area=$3&_ex=$4 [NC,QSA,L]
RewriteRule ^(.*)/(.*)/(.*)/ index.php?_page=$1&_sub=$2&_area=$3 [NC,QSA,L]
RewriteRule ^(.*)/(.*)/ index.php?_page=$1&_sub=$2 [NC,QSA,L]
RewriteRule ^(.*)/ index.php?_page=$1 [NC,QSA,L]
RewriteRule ^ index.php [NC,QSA]

我相信.*自动需要下一个块,否则它也会被捕获,所以你可以用[^/]+替换它,但是当我在一行上执行此操作时(删除除第一个规则之外的所有内容),它停止工作?

2 个答案:

答案 0 :(得分:1)

您可能会感到失望,因为您无法解决所要求的问题。

此外,对于每个(n + 1)子目录,变量名称都会更改...所以肯定没有解决方案。

无论如何,您可以使用以下内容减少RewriteRules:

RewriteRule ^([^/]*)(/([^/]*))?/ index.php?_page=$1&_sub=$2 [NC,QSA,L]

使第二个参数为空但匹配一个或两个参数

答案 1 :(得分:0)

您的rexexp ^app/?([\w]+)?/?([\w]+)?/?([\w]+)?/?((.*?)+)?$在语义上与您的起始级联不同。

  • 带有可选/来自的应用程序在哪里?
  • 您如何处理非单词字符,例如“。”?
  • 非贪婪的操作员([\ w] +) /是多余的
  • 附加参数伪目录怎么办?

无论如何,在正则表达式中,贪婪的([^/]*)更好,因为它可以与/?一起使用。

RewriteRule ^([^/]*)/?^([^/]*)/?^([^/]*)/?^([^/]*)$ index.php?_page=$1&_sub=$2_area=$3&_ex=$4 [NC,QSA,L]