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 服务器。
经过进一步挖掘,我发现这是由 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 服务器看起来很有前途。
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |