我希望我站点的所有uri路由到一个控制器。除了从home开始的uri,admin,login或sigun_up将不会路由到那个控制器。你会怎么做?
我正在考虑某种类型的reg ex,类似这样的事情
$ route ["所有指向此控制器的链接路由,除了uri以admin,login,home和sign_up"开始之外)=' boss controller';
答案 0 :(得分:3)
我不熟悉CodeIgniter,但由于CI支持路由器中的正则表达式,因此您可以使用正则表达式^\/(?!(admin\b)|login\b\/*|home\b\/*|sign_up\b\/*)[a-zA-Z0-9_\/]*/g
来获取除/ admin / login / home或/ sign_up之外的任何内容。
这是一个你可以看一下的演示。
<强>说明:强>
^\/
匹配URI
/
(?!(admin\b)|login\b\/*|home\b\/*|sign_up\b\/*)
是一切,但不是admin | login | home | sign_up,这里\b
&#34;在字边界断言位置(^ \ w | \ w $ | \ W \ w | \ W \ W)&#34;这意味着你可以使用像adminabc或loginxxx这样的东西,如果你愿意的话,会有正确的匹配。
[a-zA-Z0-9_\/]
此部分是您的URI中可接受的字符。
<强>结果:强>
------Not passing-------
/admin
/login
/admin/xxx
/login/xxx
/home/xxx/login/xxx
/sign_up/xxx/login/xxx
--------passing---------
/
/admintest/xxx
/loginetest/xxx
/hometset/xxx
/sign_uptest/xxx
/others
/others/xxx/login/xxx
/others/xxx/others/xxx/ooo
希望它有所帮助。
答案 1 :(得分:2)
我认为你不能做负面路由 但你可以这样做:
$route['(admin|login|home|sign_up)'] = "$1";
$route['(admin|login|home|sign_up)/(:any)'] = "$1/$2";
$route['(:any)'] = "boss_controller";
答案 2 :(得分:1)
根据codeigniter documentation,您可以在路由文件中使用正则表达式,因此在这种特殊情况下,通过knittl从另一个SO Answer拉出来:
\b word boundary
\< word start
\> word end
我们可以使用单词边界来设置您的单词以忽略,然后对另一个情况执行相反的正则表达式。
正则表达式获取所有但管理员,登录,主页,注册:
([^\<(admin|login|home|sign_up)\>+-])/g
正则表达式专门管理,登录,回家和注册
([\<(admin|login|home|sign_up)\>+-])
请注意使用^
字符表示反向关系。
所以最后的路线应该是这样的:
//Typical Route
$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
//Custom Route to go TO the inverse
$route["base/([^\\<(admin|login|home|sign_up)\\>+-])/"] = "base/$1/";
//Custom Route to go TO admin/login/home/sign_up
$route["base/([\\<(admin|login|home|sign_up)\\>+-])/"] = "base/$1/";
Haven没有对它进行过测试,但理论上它应该可行。