关于路由大小写的可以绕过中间件的问题

zjkal✅

问题描述

不知道算不算BUG, 通过路由给控制器的方法设置中间件, 总是会有这样的问题, 比如:

//config/route.php
Route::any('/test/user/index', [app\test\controller\UserController::class, 'index'])->middleware(
    app\test\middleware\Test::class
);

访问 http://localhost:8787/test/user/index 会正常走中间件,
但是如果把URL里的控制器名称改成大写, 访问 http://localhost:8787/test/User/index, 就会绕过中间件, 直接到控制器了

如果把路由里的User直接改成大写, 那么小写的user又可以绕过中间件.

有啥好解决办法吗?

为此你搜索到了哪些方案及不适用的原因

我能想到的就是禁用默认路由, 然后自己设置所有路由, 但是比较麻烦.

417 2 2
2个回答

damao

小写走的是路由配置,大写走的默认路由,没问题
要么关闭默认路由,要么在config/middleware.php 里给test应用设置路由

  • zjkal✅ 2023-11-27
    1. 默认路由同时有大小写, 这个才是苦恼的地方. 不管自定义路由用大写还是小写, 另一个总是可以绕过去.
    2. webman现在的版本不支持给应用单独设置路由
six

看了下fast-route的issue,这种要用正则表达式

Route::any('/{test:(?i)test}/{user:(?i)user}/{index:(?i)index}',[app\test\controller\UserController::class, 'index'])->middleware(
    app\test\middleware\Test::class
);

这样不区分大小写了,/test/user/index /test/User/index 等都能访问到

  • zjkal✅ 2023-11-27

    嗯嗯, 哎呀, 这真是个好办法, 正则可以忽略大小写, 太感谢了 大佬 Onz

🔝