Puz*_*uzo 7 php rewrite routes codeigniter
我有Codeigniter路线的问题.我想我网站上的所有注册用户都有自己的"目录",例如:www.example.com/username1, www.example.com/username2. 该"目录"应映射到控制器"polica",方法"ogled",参数"username1".
如果我喜欢这样,那么每个控制器都映射到这条路线:"polica/ogled/parameter".这不行:
$route["(:any)"] = "polica/ogled/$1";
Run Code Online (Sandbox Code Playgroud)
这有效,但我总是手动输入信息routes.php:
$route["username1"] = "polica/ogled/username1";
Run Code Online (Sandbox Code Playgroud)
我如何做到这一点,这将自动化?
更新:
例如,我有控制器名称ads.例如,如果你去www.example.com/ads/
那里会有列出的广告.如果您要去www.example.com/username1那里,则按用户列出广告username1.还有控制器user,profile,latest,...
我的当前routes.php:
$route['oglasi'] = 'oglasi';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';
Run Code Online (Sandbox Code Playgroud)
我解决了这段代码的问题:
$route['oglasi/(:any)'] = 'oglasi/$1';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';
Run Code Online (Sandbox Code Playgroud)
此致,马里奥
Dam*_*rsy 26
你的路线的问题是,通过使用:任何你匹配,实际上...任何路线,所以你几乎卡在那里.我想你可能有两个解决方案:
1)您可以选择性地重新路由所有站点控制器,例如:
$route['aboutus'] = "aboutus";
$route['where-we-are'] = "whereweare";
//And do this for all your site's controllers
//Finally:
$route['(:any)'] = "polica/ogled/$1";
Run Code Online (Sandbox Code Playgroud)
所有这些路线必须在任何之前出现,因为它们按照它们出现的顺序被读取,如果你放置:任何在开头它将很乐意跳过所有其余的路线.
评论后编辑:
我的意思是,如果你要匹配任何段,这意味着你根本不能使用任何控制器(默认情况下,这是第一个URI段),因为路由器将始终使用你的路由器重新路由你定义的法律.为了允许CI执行其他控制器(无论它们是什么,我只是使用了一些常见的网页,但实际上可以是一切),您需要通过将它们从重新路由中排除来允许它们.你可以通过在任何规则之前放置它们来实现这一点,这样每次CI通过你的路由规则时,它首先解析你"转义"的那个,并且只有当它们与URL上找到的任何内容不匹配时,它才会传递给它到:任何规则.
我知道这仍然是代码冗长,但正如你所说,它们肯定会少于6K.由于我不知道您的URL和Web应用程序的实际结构,因此它是我脑海中唯一的解决方案.如果您提供更多信息,例如如何塑造您应用的常规网址,那么我可以更新我的答案
/结束编辑
这不是一个实用的解决方案,因为它需要大量的代码,但如果你想要这样的设计,这是我想到的唯一方法.此外,考虑你可以使用正则表达式作为$ route索引,但我不认为它可以在这里工作,因为你的用户名不太可能以这种方式匹配,但我只是想指出可能性.
要么
2)您可以稍微改变您的设计模式,并为用户名分配另一条路线,这是一条沿线的
$route['user/(:any)'] = "polica/ogled/$1";
Run Code Online (Sandbox Code Playgroud)
这将产生非常漂亮(和语义)的URL,并且将避免逃避其他路由的所有麻烦.