所以,我会解释这个问题,实际的问题是,如果它是一个Bug:
$routes = new RouteCollection();
$context = new RequestContext('/');
$matcher = new UrlMatcher($routes, $context);
$route = new Route('/foo/{name}');
$routes->add('route_name', $route);
$parameters = $matcher->match('/foo/somedata%2Fblax');
这给出了一个例外'找不到“/ foo / somedata%2Fblax”的路线
如果从路径中删除%2F(url编码的斜杠),如:
$parameters = $matcher->match('/foo/somedatablax');
然后一切正常,$参数:
array (size=2)
'name' => string 'somedatablax' (length=12)
'_route' => string 'route_name' (length=10)
所以进一步将url模式设置为/foo/somedata/{name}
:
$routes = new RouteCollection();
$context = new RequestContext('/');
$matcher = new UrlMatcher($routes, $context);
$route = new Route('/foo/somedata/{name}');
$routes->add('route_name', $route);
$parameters = $matcher->match('/foo/somedata%2Fblax');
这将返回:
array (size=2)
'name' => string 'blax' (length=4)
'_route' => string 'route_name' (length=10)
这意味着当匹配模式时,url编码的斜杠被视为常规斜杠,这似乎是错误的(这不是url编码存在的原因之一吗?)
我做了一些调查,发现为什么这种方式有效(虽然不容易修复)
这是一个错误还是我的逻辑中有任何流程?它显然看起来像一个bug,但它似乎已经存在了很长一段时间(从一开始可能是?)
默认情况下,任何路由参数都匹配字符“/”,尽管您可以使用参数要求设置正则表达式以匹配您认为合适的值。
https://symfony.com/doc/current/routing/requirements.html
$routes = new RouteCollection();
$context = new RequestContext('/');
$matcher = new UrlMatcher($routes, $context);
$route = new Route('/foo/{name}', [], ['name'=>'.+']);
$routes->add('route_name', $route);
$parameters = $matcher->match('/foo/somedata%2Fblax');
现在它应该匹配你的路线。
虽然你是对的。 symfony路由器在匹配路由之前执行rawurldedecode:
供应商/ symfony的/ symfony的/ SRC / Symfony的/组件/路由/匹配器/ UrlMatcher.php
/**
* {@inheritdoc}
*/
public function match($pathinfo)
{
$this->allow = array();
if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) {
return $ret;
}
[...]
}