Symfony 4.3 路由问题 - 每条路由都与 urlRedirectAction 匹配

Posted

技术标签:

【中文标题】Symfony 4.3 路由问题 - 每条路由都与 urlRedirectAction 匹配【英文标题】:Symfony 4.3 Routing issue - every route matched with urlRedirectAction 【发布时间】:2019-11-20 22:56:10 【问题描述】:

我正在将 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 类的一部分

【问题讨论】:

请提供已定义路由的示例,以及您正在使用的 URL 以及它们是否实际上以任何方式被重定向。 【参考方案1】:

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

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

示例 1

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

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

GET /foo/ 会重定向到GET /fooGET /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 中的 line 63 所做的(即示例 1 中的 GET /foo/)。如果路由可以完全匹配(即示例 1 中的 GET /foo),则不应到达此重定向,匹配器应返回 line 39。

所以对于你的具体路由配置,问题是:

    您是否依赖 /foo/foo/ 不同?使用默认匹配器将不再可能(对于 GET 或 HEAD 请求)。 您是用/foo/ 请求/foo 还是反之亦然?这应该不是问题,但会导致重定向,可能会导致其他地方出现问题。

如果您的问题仍然存在,请提供您的路由配置的相关摘录以及请求和重定向 URL 的示例。

【讨论】:

你知道这是什么时候引入的吗? 一直支持从/foo/foo/ 的重定向,其他方向在Symfony 4.1 中实现。资料来源:symfony.com/blog/new-in-symfony-4-1-smarter-url-redirections,公关:github.com/symfony/symfony/pull/26283。 4.1 的文档也提到了这一点 (symfony.com/doc/4.1/…)。

以上是关于Symfony 4.3 路由问题 - 每条路由都与 urlRedirectAction 匹配的主要内容,如果未能解决你的问题,请参考以下文章

FOSJSRoutingBundle:“路由 xxx 不存在”

Symfony路由配置教程已开课

symfony 注解中的路由问题

Symfony 子域路由

在 symfony 中重定向到“/”路由

Symfony 4 不自动装配动态路由控制器