递归htaccess重写规则

时间:2016-06-21 04:02:51

标签: apache .htaccess mod-rewrite recursion

我使用这个htaccess rewriterule:

RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/?$ /index.php?lang=$1 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/?$ /index.php?lang=$1&controller=$2 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6 [L]
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6&p5=$7 [L]

正如您所看到的,其逻辑是第一个参数是语言格式化(即:enen-US),第二个参数是控制器其余的参数命名为'p' concat n,其中n是参数(p1 / p2 / p3)的订单号。

现在,我想添加这样的内容:

RewriteRule ^([a-zA-Z0-9]{3,})/?$ /index.php?defaultcontroller=true&p1=$1 [L]
RewriteRule ^([a-zA-Z0-9]{3,})/([^/]*)/?$ /index.php?defaultcontroller=true&p1=$1&p2=$2 [L]
// And so on ...

如果第一个参数不是语言格式,控制器是默认控制器,第一个参数是p1,第二个参数是p2,这是上。但这有三个问题:

  • ([a-zA-Z0-9]{3,})不是对([a-z]{2}|[a-z]{2}\-[A-Z]{2})的否定。 http://example.com/ehttp://example.com/3n等网址与任何模式都不匹配(它们应匹配第二种模式)。
  • 我最终会有超过10行。
  • 我有参数限制。 http://example.com/es-US/controller/p1/p2/p3/p4/p5/p6与任何模式都不匹配。

那么,请你帮我把它减少到只有两行的(种类)递归代码(一个用于第一个参数,一个用于语言格式化,一个用于第一个参数非laguage formated)?

1 个答案:

答案 0 :(得分:1)

您可以使用以下1个班轮:

    RewriteRule ^(en|en-US)/?([^/]*)/?([^/]*)/?([^/]*)/?([^]*)/([^/]*)/?([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6&p5=$7 [L]