Php 如何在自定义MVC.htaccess中传递多个get值
我试图创建一个.htaccess来处理一些PHP MVC请求。标准格式为: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
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
的值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
)。