如何处理 php league 路由中多余的“/”?
How to deal with extra "/" in phpleague route?
我正在为我的 Web 应用程序设置端点,如下所示:
$router = new League\Route\RouteCollection;
function user_action (Request $request, Response $response) {
// some logic
.
.
.
return $response;
}
$router->addRoute('GET', '/user', 'user_action');
/user 端点运行良好。
然而,当我使用 /user/(最后的额外斜杠)时,我得到一个
League\Route\Http\Exception\NotFoundException
我希望两个端点都指向同一个函数。
我可以通过分别为两个端点添加路由来实现所需的行为:
$router->addRoute('GET', '/user', 'user_action');
$router->addRoute('GET', '/user/', 'user_action');
推荐的解决方法是什么?
有两种选择
- 您可以使用 htaccess 去除 url.
中的尾部斜杠
- 向调度员发送不带尾部斜杠的 url。
解决方案 1:htaccess
将以下重写规则添加到您的 .htacces:
RewriteRule ^(.*)/$ / [L,R=301]
解决方案 2:调度程序
从 RouteCollection 创建路由器后,您将获得调度程序并调度路由:
$router = new RouteCollection();
$dispatcher = $router->getDispatcher();
$response = $dispatcher->dispatch($request->getMethod(), $request->getPathInfo());
发送给调度器的url可以轻松调整:
$url = $request->getPathInfo();
// if url ends with a slash, remove it
$url = rtrim($url, '/');
$response = $dispatcher->dispatch($request->getMethod(), $url);
两种简单的解决方案,您使用哪种取决于您。
我正在为我的 Web 应用程序设置端点,如下所示:
$router = new League\Route\RouteCollection;
function user_action (Request $request, Response $response) {
// some logic
.
.
.
return $response;
}
$router->addRoute('GET', '/user', 'user_action');
/user 端点运行良好。
然而,当我使用 /user/(最后的额外斜杠)时,我得到一个
League\Route\Http\Exception\NotFoundException
我希望两个端点都指向同一个函数。 我可以通过分别为两个端点添加路由来实现所需的行为:
$router->addRoute('GET', '/user', 'user_action');
$router->addRoute('GET', '/user/', 'user_action');
推荐的解决方法是什么?
有两种选择
- 您可以使用 htaccess 去除 url. 中的尾部斜杠
- 向调度员发送不带尾部斜杠的 url。
解决方案 1:htaccess
将以下重写规则添加到您的 .htacces:
RewriteRule ^(.*)/$ / [L,R=301]
解决方案 2:调度程序
从 RouteCollection 创建路由器后,您将获得调度程序并调度路由:
$router = new RouteCollection();
$dispatcher = $router->getDispatcher();
$response = $dispatcher->dispatch($request->getMethod(), $request->getPathInfo());
发送给调度器的url可以轻松调整:
$url = $request->getPathInfo();
// if url ends with a slash, remove it
$url = rtrim($url, '/');
$response = $dispatcher->dispatch($request->getMethod(), $url);
两种简单的解决方案,您使用哪种取决于您。