如何处理 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');

推荐的解决方法是什么?

有两种选择

  1. 您可以使用 htaccess 去除 url.
  2. 中的尾部斜杠
  3. 向调度员发送不带尾部斜杠的 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);

两种简单的解决方案,您使用哪种取决于您。