2017-12-26 29 views
1

に一致しないパラメータ値の原因で、私はそれはバグだ場合、問題と実際の質問がされるについて説明します:symfonyの3.4 /ルーティング:URLエンコード「/」だからルート

$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'); 

これは、「例外を与えます以下のようなパスから%2F(URLエンコードされたスラッシュ)を削除した場合、 "2Fblax/fooの/ someDataが%で"」

が見つかりませ路線:

$parameters = $matcher->match('/foo/somedatablax'); 

その後、すべてが$パラメータ、正常に動作しません:

array (size=2) 
    'name' => string 'somedatablax' (length=12) 
    '_route' => string 'route_name' (length=10) 

ので、さらに/foo/somedata/{name}するURLパターンを設定GOING:

$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'); 

これが返されます:パターンに一致するとき、URLエンコードされたスラッシュが通常のスラッシュとして扱われたことを意味し

array (size=2) 
    'name' => string 'blax' (length=4) 
    '_route' => string 'route_name' (length=10) 

ました間違っているようです(URLエンコードが存在する理由の1つではありません)

調査を行い、それがなぜこのように機能するのかを知ることができました。(固定するのは簡単ではありません)

これはバグですか、それとも私のロジックに流れがありますか?明らかにバグのように見えるが、それは長い間そこにあるように思える。(当初からかもしれない?)

また、実際にはそうではなく、この特定の問題の解決策になりますが、まだ関連しています):symfony4symfony2と同じです。

+0

明確にする:symfonyのルータは、ルートを照合する前にrawurldecodeを行います'requirements = {" token = "。+"} ')は、提供されたリンクに記載されているようにURLの最後のパラメータにしか適用できませんので、普遍的な解決策ではありません – user2227791

答えて

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の/ symfonyの/ SRC/symfonyの/コンポーネント/ルーティング/マッチャー/ UrlMatcher.php

/** 
    * {@inheritdoc} 
    */ 
    public function match($pathinfo) 
    { 
     $this->allow = array(); 

     if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) { 
      return $ret; 
     } 
     [...] 
    } 
+0

私の質問に関連していないようです、 私が間違っている? – user2227791

+0

私は本当にそれが答えだと思っていますが、おそらく私は自分自身を正しく説明していないかもしれません。あなたはそれがなぜ1つのケースで合っているのか、もう1つのケースで合っていないのかを尋ねていますか?私は、コンテンツをデコードすることと、両方のユーザーの場合に同じように動作させる方法について、あなたが正しく言及していると説明しました。 – albert

+0

これは関連性があると編集したにもかかわらず、まだ解決策ではありません。このソリューションは、私が提供したリンクで説明されています。これは解決策ではありません。なぜなら、URLの最後のパラメータ、[symfony doc](http://symfony.com/doc/current/routing/slash_in_parameter)に対してのみ正しく動作するからです。html)注: たとえば、ルート定義が/ share/{path}/{token}で、パスとトークンaccept /の両方がある場合、pathはその内容とトークンを含み、トークンは空になります。 – user2227791

関連する問題