【发布时间】:2016-06-21 04:02:51
【问题描述】:
我使用这个 htaccess 重写器:
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),第二个参数是控制器,其余为参数命名为'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这样的 URL 不会匹配任何模式(它们应该匹配第二个)。 - 我最终会得到超过 10 行。
- 我有参数限制。
http://example.com/es-US/controller/p1/p2/p3/p4/p5/p6不会匹配任何模式。
所以,请你帮我把它简化为只有两行的(某种)递归代码(第一个参数是语言格式,第一个参数是非语言形成)?
【问题讨论】:
标签: apache .htaccess mod-rewrite recursion