如何在Slim 3或nikic / FastRoute参数中允许点?

时间:2017-01-02 20:04:45

标签: php url-routing slim slim-3

我正在使用Slim 3,它使用nikic / FastRoute,并且遇到像这样的端点有问题:

$app->get('/count/{url}', function ($request, $response) use ($curl) {
    $controller = new Proximate\Controller\CountUrl($request, $response);
    $controller->setCurl($curl);
    return $controller->execute();
});

我的计划是将urlencoded网址传递到{url}并将其注入控制器。例如,对于http://www.example.com,请求将为:

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.example.com%2F

然而,这失败了404,所以显然不匹配。这也失败了:

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.

然而,奇怪的是,这确实匹配(即没有尾随点):

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww

我原本以为是urlencoded的斜线让它感到困惑(%2F)但是在没有这些字符的情况下尝试了它,我发现实际上它是字符串中的任何位置。为什么这不匹配,我是否需要正则表达式匹配才能使其正常工作?

我正在为此应用使用PHP内置Web服务器。

1 个答案:

答案 0 :(得分:3)

经过一番挖掘,我发现这是由PHP内置的Web服务器引起的,根本不是Slim或FastRoute问题。这是the Slim bug report,这里有一个for PHP

遗憾的是,核心PHP团队标记为curl \ --verbose \ http://localhost:8080/index.php/count/http%3A%2F%2Fwww.example.com%2F # ^^^^^^^^^ # Script name ,因为服务器仅用于测试。就我个人而言,我认为关于不使用此服务器进行生产的警告有点过分了(我的Docker容器仍然具有合理的可管理性因为我也不会在那里投入Apache)。

值得庆幸的是有一个解决方法 - 指定URL中的脚本名称将导致PHP将其余部分正确传递给路由系统。像这样:

{{1}}

当然,这不是很优雅,所以我可能会切换到另一种解决方案。我还没有尝试过,但this PHP-only web server看起来非常有希望。