Symfony2路由器与尾部斜杠不一致

时间:2014-05-05 19:33:24

标签: php url symfony redirect symfony-2.4

我有一个非常简单的捆绑控制器

<?php

namespace Mnab\ContactBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction($anything)
    {
        return new \Symfony\Component\HttpFoundation\Response(__CLASS__ .' '.$anything);
        //return $this->render('MnabContactBundle:Default:index.html.twig', array('name' => $anything));
    }
}

我在YML文件中有roter配置

案例1 :此控制器的路由如下:

mnab_contact_homepage:
    pattern:  contact/{anything}
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序会为此控制器接受以下网址:

  

/ contact / contact / / contact / bla / contact / bla / bla / blabla

等等

案例2 我对此控制器的路由如下:

mnab_contact_homepage:
    pattern:  contact/
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序只接受

  

/接触/

如果有网址:

  

/ contact - &gt;它使重定向(不要知道什么类型301或302)到/ contact / url

案例3 此控制器的路由如下所示:

mnab_contact_homepage:
    pattern:  contact
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序只接受

  

/接触

预期结果

在案例3中,一切都如我所料,但案例1和2的工作并不像我预期的那样

问题

  1. 为什么案例1 应用程序也接受/ contact url?我明确期望/联系/网址不联系/

  2. 为什么案例2 应用程序也接受/ contact url将其重定向到/ contact /

  3. 为什么行为在案例1 案例2

  4. 中有所不同
  5. 是否可以更改此行为 - 例如在我的情况下根本不接受/联系? (事实上​​我不介意,因为我想要一些带尾随斜杠的网址但是在 case 1 中我必须为版本重定向而不用斜杠)

  6. Symfony是否会这样做&#34;技巧&#34;对于所有网址(也有扩展名,例如我定义它适用于/test.html,Symfony也适用于/test.html/)或仅适用于没有扩展名的网址?

  7. 我在哪里可以阅读更多有关此类案件的内容?

1 个答案:

答案 0 :(得分:2)

  

为什么1个应用程序也接受/联系url?我清楚了   期待/联系/网址不联系/

/contact表示您遗漏了anything参数,在这种情况下null

/contact/表示您不会遗漏anything参数。在这种情况下,应该抛出NotFoundHttpException,因为您没有为anything参数提供任何值。

  

为什么2个应用程序也接受/联系网址制作   将其重定向到/ contact /

这是Symfony2 routing component的行为,真的无法更多地了解它。

  

为什么在案例1和案例2中行为不同

因为在案例1中,路线中有参数。该参数虽然是默认值。在案例2中,路线中没有参数。

  

是否可以更改此行为 - 例如,不接受at   所有/联系我的情况

是的,例如,将anything参数设为必需参数,而不是可选参数。

  

Symfony是否会这样做&#34;技巧&#34;对于所有网址(也有扩展名)   示例我定义它适用于/test.html,Symfony使其工作   也适用于/test.html/)或仅适用于没有扩展名的人

路由组件的行为是一致的,如果您使用testtest.html则无关紧要。

  

我可以在哪里阅读更多关于此类案件的内容?

关于此问题,我们不是很多来源,但您可以随时查看routing component的源代码。

但是,可以在此处找到路由组件的文档Routing