我正在使用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服务器。
答案 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看起来非常有希望。