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

codeigniter - route all uri to one special uri except some cases

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

我在想某种正则表达式,像这样

$route["all link route to this controller, except uri starting with admin, login, home and sign_up"] = 'boss controller';

根据 knittl 的 codeigniter documentation you can use regex within the routes files, so in this particular case, pulling from another 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+)'] = "/id_";

//Custom Route to go TO the inverse
$route["base/([^\<(admin|login|home|sign_up)\>+-])/"] = "base//";

//Custom Route to go TO admin/login/home/sign_up
$route["base/([\<(admin|login|home|sign_up)\>+-])/"] = "base//";

还没有测试过,但理论上应该可以。

我不熟悉 CodeIgniter,但由于 CI 在路由中支持正则表达式,您可以使用正则表达式 ^\/(?!(admin\b)|login\b\/*|home\b\/*|sign_up\b\/*)[a-zA-Z0-9_\/]*/g 获取除 /admin /login /home 或 /[=39= 之外的任何内容]. 这里有一个演示,你可以看看。

说明:

^\/ 匹配 URI

中的起始 /

(?!(admin\b)|login\b\/*|home\b\/*|sign_up\b\/*) 是一切,但不是 admin|login|home|sign_up,在这里 \b "assert position at a word boundary (^\w|\w$|\W\w|\w\W)" 这意味着您可以根据需要使用 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

希望对您有所帮助。

我认为你不能做负路由。
但是您可以按照以下方式进行操作:

$route['(admin|login|home|sign_up)'] = "";
$route['(admin|login|home|sign_up)/(:any)'] = "/";
$route['(:any)'] = "boss_controller";