codeigniter - 除了某些情况外,将所有uri路由到一个特殊的uri

时间:2015-02-09 04:05:51

标签: php regex codeigniter

我希望我站点的所有uri路由到一个控制器。除了从home开始的uri,admin,login或sigun_up将不会路由到那个控制器。你会怎么做?

我正在考虑某种类型的reg ex,类似这样的事情

$ route ["所有指向此控制器的链接路由,除了uri以admin,login,home和sign_up"开始之外)=' boss controller';

3 个答案:

答案 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

Demo

希望它有所帮助。

答案 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没有对它进行过测试,但理论上它应该可行。