Php 如何在自定义MVC.htaccess中传递多个get值

Php 如何在自定义MVC.htaccess中传递多个get值,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我试图创建一个.htaccess来处理一些PHP MVC请求。标准格式为: domain.com/module/Controller/action 但在某些情况下,我需要传递GET变量,例如: domain.com/module/Controller/action/foo/bar 我需要在PHP中接收varfoo,其值为bar domain.com/module/Controller/action/foo/bar/hello/world 同样,我需要获得varfoo和hello的值worl

我试图创建一个.htaccess来处理一些PHP MVC请求。标准格式为:

domain.com/module/Controller/action
但在某些情况下,我需要传递GET变量,例如:

domain.com/module/Controller/action/foo/bar
我需要在PHP中接收var
foo
,其值为
bar

domain.com/module/Controller/action/foo/bar/hello/world
同样,我需要获得var
foo
hello
的值
world

对于未定义数量的变量,规则必须相同,如下所示

domain.com/module/Controller/action/foo/bar/hello/world/[...]/last/var
在模块、控制器和动作之后,我总是有成对的
var
/

RewriteRule ^([a-z]+)/([A-Z]{1}[a-zA-Z]+)/([a-zA-Z]+)/?$ index.php?module=$1&controller=$2&action=$3
我使用的重写规则如下,它只检测模块、控制器和操作

RewriteRule ^([a-z]+)/([A-Z]{1}[a-zA-Z]+)/([a-zA-Z]+)/?$ index.php?module=$1&controller=$2&action=$3
我没有看到我应该如何改变以获得预期的行为。欢迎任何帮助。

以下规则

RewriteRule ^/?([a-z]+)/([A-Z][a-zA-Z]+)/([a-zA-Z]+)((:?/[^/]+/[^/]+)*)$ /index.php?module=$1&controller=$2&action=$3&rest=$4
将生成以下
$\u GET
数组

Array
(
    [module] => module
    [controller] => Controller
    [action] => action
    [rest] => /hello/world
)
您可以使用PHP分解方法和一些数组操作来解析
[rest]

另外,您不需要
[A-Z]{1}
,它已经匹配了一个令牌(令牌或字符?),因此您可以将其替换为
[A-Z]

更新

如果您不想强制使用区分大小写的URL,那么下面的简化规则将起作用

RewriteRule ^/?([a-z]+)/([a-z]+)/([a-z]+)((:?/[^/]+/[^/]+)*)$ /index.php?module=$1&controller=$2&action=$3&rest=$4 [NC]
更新2

((:?/[^/]+/[^/]+)*)
是获取
/键/值
对的对象,可以分解为

/
匹配一个
/

[^/]+
匹配一个或多个非
/

(…)*
查找介于
0或尽可能多次之间的内容

:?
(…)
从捕获组转换为仅绑定组,而不为其创建变量


因此,实际上,这一部分试图匹配“非斜杠”或“非斜杠”的出现,如果找到,则将整个事件放入
$4
重写规则([a-z]+)/([a-z]{1}[a-zA-z]+)/([a-zA-z]+)/([a-zA-z]+)/foo/([a-zA-z]+)/([a-zA-z]+)/hello/([a-zA-z]+)/?$index.php?module=$1&controller=$2&action=$3&foo=$4&hello=$5
@KristerAndersson,变量是动态的,我不知道它的名称,所以我不能使用静态规则尼斯,建议,我现在试试。
[A-Z]{1}
是因为控制器名称必须以大写字母开头。可以吗?
[A-Z]
将正好匹配一个大写字母,所以这没问题。请您做一个更新,准确解释
(/[^/]+/[^/]+)*
的功能?对不起,我的正则表达式知识还很薄弱。非常感谢您的更新!当我尝试
domain.com/module/Controller/action/foo/bar/hello/world
时,.htaccess只提供最后一对(hello/world)。你知道如何修复它吗?我可以稍微研究一下,但是如果你知道你的URL是什么样子的话,你也可以使用
RewriteRule^/?([a-z]+)/([a-z]+)/(/.z]+)*$/index.php?module=$1&controller=$2&action=$3&rest=$4[NC]
(并在php中验证
rest
)。