Symfony 3.4 / routing:参数值中的Urlencoded“/”导致与路由不匹配

问题描述 投票:4回答:1

所以,我会解释这个问题,实际的问题是,如果它是一个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,但它似乎已经存在了很长一段时间(从一开始可能是?)

还有一种解决方案(实际上不是,它并不意味着解决这个特殊问题,但仍然相关):symfony4symfony2相同。

symfony routing
1个回答
0
投票

默认情况下,任何路由参数都匹配字符“/”,尽管您可以使用参数要求设置正则表达式以匹配您认为合适的值。

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;
        }
        [...]
    }
© www.soinside.com 2019 - 2024. All rights reserved.