路由问题 - 每个路由都与 urlRedirectAction 匹配

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

我正在将 Symfony 从 3.4 升级到 4.3,并且遇到一种情况,每个路由都与控制器和方法正确匹配,但随后请求到达

RedirectableCompiledUrlMatcher
并将正确的参数替换为
_controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction

这会触发各种其他事情,例如调用参数转换器、访问防火墙以及其他与路由相关的事情,这是不应该的,因为匹配的路由不正确。

继续调试 3.4 项目,无需替换正确的参数。

我的问题是,这现在是否是正确的请求流(即每个路由都必须通过 urlRedirectAction),我需要配置其他内容,或者有什么方法可以避免调用,我猜,

RedirectableCompiledUrlMatcher

是否有可能发生这种情况,因为

RedirectableUrlMatcher
\Symfony\Component\Routing\Router
的默认匹配器,为什么它是默认匹配器?有机会像 3.4 中那样用普通的
UrlMatcher
替换它吗?

正是这一行

vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php:63
,我的
$ret
与我的控制器正确匹配,并且正在调用
$this->redirect()
,它将我的控制器替换为Symfony RedirectController。 特质是
RedirectableCompiledUrlMatcher

的一部分
symfony symfony4 symfony-routing
1个回答
3
投票

Symfony 4 更改了路由,以便对于 GET 和 HEAD 请求,带有尾部斜杠的路由被认为等同于没有斜杠的路由(参见 https://symfony.com/doc/4.3/routing.html#redirecting-urls-with -尾部斜杠)。

如果您有两个版本的路由定义,则将匹配第一个版本。如果您以其他方式使用,RedirectableUrlMatcherInterface 将创建到此路由的重定向。

示例1

# routes.yaml
foo:
  path: /foo
  controller: App\Controller\FooController::fooAction

foo_trail:
  path: /foo/
  controller: App\Controller\FooController::fooAction

GET /foo/
将重定向到
GET /foo
GET /foo
将正常匹配。

示例2

# routes.yaml
foo_trail:
  path: /foo/
  controller: App\Controller\FooController::fooAction

foo:
  path: /foo
  controller: App\Controller\FooController::fooAction

GET /foo
将重定向到
GET /foo/
GET /foo/
将正常匹配。


针对缺失/附加尾部斜杠的重定向是 CompiledUrlMatcherTrait 中第 63 行所做的(即示例 1 中的 GET /foo/)。如果路由可以精确匹配(即示例 1 中的

GET /foo
),则不应到达此重定向,并且匹配器应在
第 39 行
中返回。 因此,对于您的特定路由配置,问题是:

您是否相信
    /foo
  1. /foo/
    有所不同?使用默认匹配器将不再可能(对于 GET 或 HEAD 请求)。
    您是用 
  2. /foo
  3. 请求
    /foo/
    还是反之亦然?这应该不是问题,但会导致重定向,从而可能在其他地方引起问题。
    
    
    
  4. 如果问题仍然存在,请提供路由配置的相关摘录以及请求和重定向 URL 的示例。

© www.soinside.com 2019 - 2024. All rights reserved.