Apache 递归访问重写规则

Apache 递归访问重写规则,apache,.htaccess,mod-rewrite,recursion,Apache,.htaccess,Mod Rewrite,Recursion,我使用此规则: 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=

我使用此规则:

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]
如您所见,其逻辑是第一个参数是语言格式化的(即:
en
en-US
),第二个参数是控制器的a,其余参数命名为
'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/e
    http://example.com/3n
    不匹配任何模式(它们应该匹配第二个模式)
  • 我将以超过10行结束
  • 我有一个参数限制<代码>http://example.com/es-US/controller/p1/p2/p3/p4/p5/p6与任何图案都不匹配

所以,请你帮我把它简化成一种递归代码,只有两行(一行用于第一个参数是语言格式化的,另一行用于第一个参数是非语言格式化的)

你可以使用以下1行代码:

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

我想这使得参数是可选的。美好的我不能使用
(en | en US)
,但是
([a-z]{2}{a-z]{2}-[a-z]{2})
,因为我必须接受许多语言代码。另外,你知道如何否定
([a-z]{2}|[a-z]{2}-[a-z]{2})