1

我正在使用 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 传递{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 服务器。

4

1 回答 1

4

经过一番挖掘,我发现这是由 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

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

于 2017-01-02T20:19:06.187 回答