这个网络路由规则是否可能将所有网址请求重定向到主页?

时间:2018-03-02 09:29:15

标签: routing nette

我和一位高级开发人员在一起说我的路由是错误和危险的,可能所有的请求都可能被路由到homepege,但我认为他错了,我甚至测试了它。他说通过添加这个

$this->router[] = new Route('/', 'Front:Bridge:default');

此定义下的所有路线都将被忽略,所有路线都将路由到Front:Bridge

我认为是BS,因为该路线明确指出仅重定向请求直接向Web根目录请求Front:Bridge。应用程序的功能确实没有改变,但他坚持认为我肯定会在某处引入不可见的bug。

ref的整个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;
}

1 个答案:

答案 0 :(得分:2)

解决这场辩论的一个好方法是从官方Nette docs中引用引文。

在我们回答您的问题之前,remember the order of routes matter非常重要:

  

路线顺序很重要,因为它们是从第一个到最后一个顺序尝试的。基本规则是声明从最具体到最一般的路线。

接下来,请回想一下路由与完全匹配。如果有/foo的路线,则/foo/bar的请求不匹配。这里没有官方引用,但它暗示并且很容易通过测试应用验证。

有了这些知识,让我们来看看你的建议。如果你使用这条路线:

$this->router[] = new Route('/', 'Front:Bridge:default');

你是对的。这只会匹配/。不是/foo,而是/foo/bar等等。由于它是如此明确,订单无关紧要,而且没有太大的灾难空间。

然而,在您的代码段结尾处有一条重要路线:

$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');

这是 与匹配/不同的全能路线,可能是您的同伴实际担心的:因为它不明确(通过匹配所有路径!)这条路线的顺序肯定很重要。首先放置它,所有请求都会重定向到Front:Bridge:default