此网络路由规则是否会将所有 url 请求重定向到主页?
WIll this nette routing rule potentially redirect all url requests to homepage?
我作为初级开发人员与一位高级开发人员争论,他说我的路由是错误和危险的,可能所有请求都可以路由到 homepege,但我认为他是错误的,我什至测试了它。他说通过添加这个
$this->router[] = new Route('/', 'Front:Bridge:default');
此定义下的所有路由都将被忽略,所有内容都将路由到 Front:Bridge
我认为这是 BS,因为路由明确指出仅将请求直接重定向到 Web 根目录到 Front:Bridge。应用程序的功能确实没有改变,但他坚持我肯定会在某处引入无法预料的错误。
参考的整个 routerFactory
public function getRouter()
{
$this->router[] = new Route('/muj-ucet[/<action=default>]', [
'module' => 'Front',
'presenter' => 'Account',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'zpravy' => 'message',
'profil' => 'profile',
'objednavky' => 'orders',
'sprava-uzivatelu' => 'users'
],
],
]);
$this->router[] = new Route('/', 'Front:Bridge:default');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/prihlaseni.html', 'OnlineUser:Front:Login:default');
$this->router[] = new Route('/superadmin/prihlaseni', 'OnlineUser:Front:Login:superAdminLogin');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/registrace.html', 'OnlineUser:Front:Registration:default');
$this->router[] = new Route('/potvrzeni-registrace', Linker::ACTION_CONFIRM_REGISTRATION);
$this->router[] = new Route('/aktivace-uctu', Linker::ACTION_ACTIVATION_ACCOUNT);
$this->router[] = new Route('/nove-heslo', Linker::ACTION_FORGOT_PASSWORD);
$this->router[] = new Route('/logout', 'OnlineUser:Front:Login:logout');
$this->router[] = new Route('/validace/<action=default>', [
'module' => 'OnlineUser:Front',
'presenter' => 'Validation',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'validace-emailu' => 'validateEmailNotExists',
'validace-ico' => 'validateIcNotExists',
'validace-ico-ares-heo' => 'validateIcAresAndHeO',
],
],
]);
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
return $this->router;
}
解决这场争论的一个好方法是从官方 Nette docs.
中引用引文
在我们回答您的问题之前,重要的是 remember the order of routes matter:
Order of routes is important, because they are tried sequentially from the first one to the last one. Basic rule is we declare routes from the most specific to the most general.
接下来,回想一下路由 完全匹配 。如果有 /foo
的路由,它将不会匹配 /foo/bar
的请求。对此没有官方引用,但它是隐含的,并且可以通过测试应用程序轻松验证。
有了这些知识,让我们来看看你的提案。如果你使用这条路线:
$this->router[] = new Route('/', 'Front:Bridge:default');
你是对的。那只会匹配 /
。不是/foo
,不是/foo/bar
,等等。既然如此明确,那么顺序就无所谓了,容灾空间不大。
然而,在您的代码段末尾有一条重要路线:
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
这是一条 catch-all 路由 不同于匹配 /
并且可能是你的同伴真正担心的:因为它是模棱两可的 (通过匹配所有路径!)这条路线的顺序 绝对 很重要。通过将它放在第一位,所有请求都会重定向到 Front:Bridge:default
.
我作为初级开发人员与一位高级开发人员争论,他说我的路由是错误和危险的,可能所有请求都可以路由到 homepege,但我认为他是错误的,我什至测试了它。他说通过添加这个
$this->router[] = new Route('/', 'Front:Bridge:default');
此定义下的所有路由都将被忽略,所有内容都将路由到 Front:Bridge
我认为这是 BS,因为路由明确指出仅将请求直接重定向到 Web 根目录到 Front:Bridge。应用程序的功能确实没有改变,但他坚持我肯定会在某处引入无法预料的错误。
参考的整个 routerFactory
public function getRouter()
{
$this->router[] = new Route('/muj-ucet[/<action=default>]', [
'module' => 'Front',
'presenter' => 'Account',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'zpravy' => 'message',
'profil' => 'profile',
'objednavky' => 'orders',
'sprava-uzivatelu' => 'users'
],
],
]);
$this->router[] = new Route('/', 'Front:Bridge:default');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/prihlaseni.html', 'OnlineUser:Front:Login:default');
$this->router[] = new Route('/superadmin/prihlaseni', 'OnlineUser:Front:Login:superAdminLogin');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/registrace.html', 'OnlineUser:Front:Registration:default');
$this->router[] = new Route('/potvrzeni-registrace', Linker::ACTION_CONFIRM_REGISTRATION);
$this->router[] = new Route('/aktivace-uctu', Linker::ACTION_ACTIVATION_ACCOUNT);
$this->router[] = new Route('/nove-heslo', Linker::ACTION_FORGOT_PASSWORD);
$this->router[] = new Route('/logout', 'OnlineUser:Front:Login:logout');
$this->router[] = new Route('/validace/<action=default>', [
'module' => 'OnlineUser:Front',
'presenter' => 'Validation',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'validace-emailu' => 'validateEmailNotExists',
'validace-ico' => 'validateIcNotExists',
'validace-ico-ares-heo' => 'validateIcAresAndHeO',
],
],
]);
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
return $this->router;
}
解决这场争论的一个好方法是从官方 Nette docs.
中引用引文在我们回答您的问题之前,重要的是 remember the order of routes matter:
Order of routes is important, because they are tried sequentially from the first one to the last one. Basic rule is we declare routes from the most specific to the most general.
接下来,回想一下路由 完全匹配 。如果有 /foo
的路由,它将不会匹配 /foo/bar
的请求。对此没有官方引用,但它是隐含的,并且可以通过测试应用程序轻松验证。
有了这些知识,让我们来看看你的提案。如果你使用这条路线:
$this->router[] = new Route('/', 'Front:Bridge:default');
你是对的。那只会匹配 /
。不是/foo
,不是/foo/bar
,等等。既然如此明确,那么顺序就无所谓了,容灾空间不大。
然而,在您的代码段末尾有一条重要路线:
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
这是一条 catch-all 路由 不同于匹配 /
并且可能是你的同伴真正担心的:因为它是模棱两可的 (通过匹配所有路径!)这条路线的顺序 绝对 很重要。通过将它放在第一位,所有请求都会重定向到 Front:Bridge:default
.