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

时间:2014-05-13 12:14:31

标签: php .htaccess mod-rewrite

我正在尝试创建一个.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

同样的事情,我需要使用值foobar获取值为hello

的var world

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

domain.com/module/Controller/action/foo/bar/hello/world/[...]/last/var

我总是在模块,控制器和操作之后成对var / value

我正在使用的RewriteRule如下,它只检测模块,控制器和动作。

RewriteRule ^([a-z]+)/([A-Z]{1}[a-zA-Z]+)/([a-zA-Z]+)/?$ index.php?module=$1&controller=$2&action=$3

我没有看到我应该如何改变以获得预期的行为。我们非常欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

遵循规则

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

将生成以下$_GET数组

Array
(
    [module] => module
    [controller] => Controller
    [action] => action
    [rest] => /hello/world
)

你可以使用PHP爆炸方法和一些数组操作来解析[rest]

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

<强>更新

如果您不想强加区分大小写的网址,则遵循简化规则即可。

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

更新2

((:?/[^/]+/[^/]+)*)抓取 /key/value对的内容,可以分解为

//

匹配

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

的令牌

(...)*查找() 0之间的任何内容或尽可能多的内容。

:?(...)从捕获组转换为仅绑定组,并且不会为其创建变量。

所以实际上,所述部分试图匹配/anyting_that_is_not_slash/anything_that_is_not_slash的出现,如果找到,则将整个内容放入$4