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
希望对您有所帮助。
我认为你不能做负路由。
但是您可以按照以下方式进行操作:
$route['(admin|login|home|sign_up)'] = "";
$route['(admin|login|home|sign_up)/(:any)'] = "/";
$route['(:any)'] = "boss_controller";
我希望我站点的所有 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
希望对您有所帮助。
我认为你不能做负路由。
但是您可以按照以下方式进行操作:
$route['(admin|login|home|sign_up)'] = "";
$route['(admin|login|home|sign_up)/(:any)'] = "/";
$route['(:any)'] = "boss_controller";