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

hal*_*fer 0 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();
});
Run Code Online (Sandbox Code Playgroud)

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

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.example.com%2F
Run Code Online (Sandbox Code Playgroud)

然而,这会失败并返回 404,因此显然不匹配。这也失败了:

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.
Run Code Online (Sandbox Code Playgroud)

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

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww
Run Code Online (Sandbox Code Playgroud)

我最初认为是 urlencoded 斜杠混淆了它 ( %2F),但在没有这些字符的情况下尝试过,我发现实际上它是字符串中任何位置的点。为什么这不匹配,我是否需要正则表达式匹配才能使其正常工作?

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

hal*_*fer 5

经过进一步挖掘,我发现这是由 PHP 内置 Web 服务器引起的,根本不是 Slim 或 FastRoute 问题。这是Slim 错误报告,这是PHP 的错误报告。

遗憾的是,核心 PHP 团队已标记为Won't fix,因为该服务器仅用于测试。就我个人而言,我认为关于不使用此服务器进行生产的警告有点过分了(我的 Docker 容器仍然具有合理可管理的大小,因为我也没有将 Apache 扔在那里)。

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

curl \
    --verbose \
    http://localhost:8080/index.php/count/http%3A%2F%2Fwww.example.com%2F
#                         ^^^^^^^^^
#                         Script name
Run Code Online (Sandbox Code Playgroud)

当然,这不是很优雅,所以我可能会转向另一种解决方案。我还没有尝试过,但是这个仅 PHP 的 Web 服务器看起来很有前途。