Symfony 4.3 路由问题 - 每条路由都与 urlRedirectAction 匹配
Symfony 4.3 Routing issue - every route matched with urlRedirectAction
我正在将 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
class
的一部分
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 /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/
会正常匹配。
missing/additional 尾部斜杠的重定向是 line 63 in CompiledUrlMatcherTrait does (i.e. GET /foo/
in example 1). If the route can be matched exactly (i.e. GET /foo
in example 1), this redirect should not be reached and the matcher should return in line 39。
所以对于你具体的路由配置,问题是:
- 您认为
/foo
和 /foo/
不同吗?使用默认匹配器将不再可能(对于 GET 或 HEAD 请求)。
- 您是用
/foo/
请求 /foo
还是相反?这应该不是问题,但会导致重定向,可能会在其他地方引起问题。
如果您的问题仍然存在,请提供您的路由配置的相关摘录以及请求和重定向的示例 URL。
我正在将 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
class
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 /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/
会正常匹配。
missing/additional 尾部斜杠的重定向是 line 63 in CompiledUrlMatcherTrait does (i.e. GET /foo/
in example 1). If the route can be matched exactly (i.e. GET /foo
in example 1), this redirect should not be reached and the matcher should return in line 39。
所以对于你具体的路由配置,问题是:
- 您认为
/foo
和/foo/
不同吗?使用默认匹配器将不再可能(对于 GET 或 HEAD 请求)。 - 您是用
/foo/
请求/foo
还是相反?这应该不是问题,但会导致重定向,可能会在其他地方引起问题。
如果您的问题仍然存在,请提供您的路由配置的相关摘录以及请求和重定向的示例 URL。