【发布时间】:2012-02-26 10:00:38
【问题描述】:
我正在 Codeigniter 中制作这个小项目,我需要在控制器之前添加一个段。
默认的 Codeigniter URL 是:
base_url/controller/function/parameter1/../parametern
我需要的是:
base_url/something/controller/function/parameter1/../parametern
其中“某物”是用户创建的名称,因此我无法按照其他主题中的建议在控制器文件夹中创建子文件夹,因为它是动态的,并且每个用户都可以选择他喜欢的内容。
基本上我需要的是它喜欢忽略那个段(我会在一个钩子中捕获那个段,扩展 CI_controller 或类似的东西并验证它),例如,如果我写 base_url/stackoverflow-rocks/home /function, base_url/asd-whatever/home/function Codeigniter 会像 base_url/home/function
我还查看了Passing variables before controller URI segment in CodeIgniter 问题,它与我的几乎相同,但建议的答案不起作用。
我使用了$route['(:any)/(:any)'] = '$2';,如果 url 是 base_url/whatever/home,它可以工作,但如果 url 是 base_url/whatever/home/function 或 base_url/whatever/home/function/param1/../paramn,它不会,解决方法是写:
$route['(:any)/(:any)'] = '$2';
$route['(:any)/(:any)/(:any)'] = '$2/$3';
...
$route['(:any)/../(:any)'] = '$2/../$n'
这很容易,但似乎有点蹩脚,只有当我在 url 中有 2 到 n 段时它才会起作用。我还尝试将它与正则表达式混合,例如:
$route['(:any)/(.*)'] = '$2'
但它的工作原理和前一个一样,(.*) 只是一个片段,而不是整个 url...
有什么方法可以写$route['(:any)/rest of the url'] = 'rest of the url';?
我也尝试过使用 .htaccess:
RewriteRule ([^/]*)/(.*) inedx.php?/$2
或
RewriteRule (.*)/(.*) index.php?/$2
但它不起作用,因为 $2 引用了第一部分,例如,如果我写:
base_url/one/two 将其重写为 base_url/index.php?/one。
但如果我使用:
RewriteRule (.*)/(.*) index.php?/$1/test/$2
它应该引用,例如 base_url/one/two => base_url/index.php?/one/test/two,所以 $1 = 1 和 $2 = 2,应该是。
一个很长的问题,但我希望有人能提供帮助,谢谢!
【问题讨论】:
标签: codeigniter url-rewriting url-routing uri codeigniter-url