如何处理额外的" /"在phpleague路线?

时间:2015-06-14 14:16:04

标签: php web-services routing

我正在为我的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 / (最后的额外斜线)时,我得到了

联赛\路由\ HTTP \异常\ NotFoundException

我希望两个端点都指向同一个函数。 我可以通过分别为两个端点添加路由来实现所需的行为:

$router->addRoute('GET', '/user', 'user_action');
$router->addRoute('GET', '/user/', 'user_action');

建议的解决方法是什么?

1 个答案:

答案 0 :(得分:2)

有两个选项

  1. 您可以使用htaccess从网址中删除尾部斜杠。
  2. 向调度员发送不带斜杠的网址。
  3. 解决方案1:htaccess

    将以下重写规则添加到.htacces:

    RewriteRule ^(.*)/$ /$1 [L,R=301]
    

    解决方案2:调度程序

    从RouteCollection创建路由器后,您将获得调度程序并分派路由:

    $router = new RouteCollection();
    $dispatcher = $router->getDispatcher();
    $response = $dispatcher->dispatch($request->getMethod(), $request->getPathInfo());
    

    可以轻松调整发送给调度员的网址:

    $url = $request->getPathInfo();
    
    // if url ends with a slash, remove it
    if (substr($url, -1) === '/') {
        $url = substr($url, 0, strlen($url) - 1);
    }
    
    $response = $dispatcher->dispatch($request->getMethod(), $url);
    

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

相关问题