在Koa中如何用正则匹配ctx.url为/?id=xxx和/的场景?
解决Koa中根路径带查询参数绕过认证的问题
嘿,我懂你遇到的这个坑!你的认证逻辑里,访问/或/admin会触发登录重定向,但一碰到/?aaa=aaa这种带查询参数的根路径,就直接绕过认证了——核心问题出在你用ctx.url === '/'判断根路径,可ctx.url是包含查询字符串的完整URL,/?aaa=aaa自然不等于/呀。
问题根源拆解
ctx.url返回完整请求URL(含查询参数):比如访问/?id=123时,ctx.url就是/?id=123ctx.path只返回URL路径部分:不管有没有查询参数,/和/?id=123的ctx.path都是/
修复后的代码方案
你只需要把根路径的判断条件换成ctx.path === '/',同时修正/admin的正则(原来的正则有语法错误,斜杠需要转义),或者用更直观的startsWith方法:
方案1:正则匹配版
if ((ctx.path === '/' || ctx.path.match(/^\/admin/)) && !ctx.session.userInfo) { // auth await ctx.redirect('/login'); return false; }
方案2:更简洁的startsWith版
if ((ctx.path === '/' || ctx.path.startsWith('/admin')) && !ctx.session.userInfo) { // auth await ctx.redirect('/login'); return false; }
为什么这样能解决问题?
ctx.path自动忽略查询字符串,所有根路径请求(无论带不带参数)都会被ctx.path === '/'匹配到startsWith('/admin')能覆盖所有以/admin开头的路径(比如/admin、/admin/user),比正则更易读,还不容易写错语法
修改后不管用户访问/、/?id=xxx还是/admin、/admin/list,只要没登录,都会被正确重定向到登录页啦!
内容的提问来源于stack exchange,提问作者ycjcl868
相关产品推荐
相关产品推荐

