我正在尝试创建一个.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
同样的事情,我需要使用值foo
和bar
获取值为hello
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
我没有看到我应该如何改变以获得预期的行为。我们非常欢迎任何帮助。
答案 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