Php 带尾随斜线的Symfony2路由器不一致
我有一个非常简单的捆绑控制器Php 带尾随斜线的Symfony2路由器不一致,php,url,symfony,redirect,symfony-2.4,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\Co
<?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));
}
}
在这种情况下,应用程序接受此控制器的以下URL:
/联系人//contact/bla/contact/bla/bla/bla/bla
等等
案例2此控制器的路由如下所示:
mnab_contact_homepage:
pattern: contact/{anything}
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
mnab_contact_homepage:
pattern: contact/
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
mnab_contact_homepage:
pattern: contact
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
在这种情况下,应用程序只接受
/接触/
及
如果有url:
/联系人->它将重定向(不知道是301还是302类型)到/contact/url
案例3此控制器的路由如下所示:
mnab_contact_homepage:
pattern: contact/{anything}
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
mnab_contact_homepage:
pattern: contact/
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
mnab_contact_homepage:
pattern: contact
defaults: { _controller: MnabContactBundle:Default:index, anything: null }
requirements:
anything: .*
在这种情况下,应用程序只接受
/接触
预期结果
在案例3中,一切都如我所料,但案例1和案例2的工作方式与我所料不同
问题
/contact
表示您省略了任何
参数,该参数在本例中为null
/contact/
表示您没有遗漏任何内容
参数。在这种情况下,应该抛出NotFoundHttpException
,因为您没有为anything
参数提供任何值
为什么案例2中的应用程序也接受/联系url制作
将其重定向到/联系/
这是一种行为,实在无法多说
案例1和案例2行为不同的原因
因为在案例1中,路由中有一个参数。该参数具有默认值。在情况2中,路由中没有参数
是否有可能改变这种行为?例如,在
我的情况下的所有/联系方式
是,例如,将anything
参数设置为强制参数,而不是可选参数
Symfony是否对所有URL(也包括扩展名)都有这样的“技巧”
例如,我为/test.html定义它,Symfony使它工作
也适用于/test.html/)或仅适用于没有扩展名的用户
路由组件的行为是一致的,无论是使用test
还是test.html
我在哪里可以读到更多关于此类案例的信息
关于这方面的源代码不多,但您可以随时查看的源代码
但是,可以在这里找到路由组件的文档。看看这个,我今天看到了这个,也看到了这个技巧,但我需要“黑客”才能让它工作,但我仍然不明白为什么在两种情况下Symfony的行为不同,因为模式不同,我希望sf2在模式中支持正则表达式,以便澄清,每次当我有具有类似路由联系人/{anything}的控制器时,任何内容都是可选的,Symfony2认为斜杠也是可选的,因为它被视为参数分隔符,当url中没有第二个参数时,Symfony2认为在这种情况下斜杠是不必要的。这样行吗?@MarcinNabiałek是的,对。对于您的URL“/contact/{anything}”适用:如果有“/contact”=没有参数并且默认值已分配给该参数,如果有“/contact/”-应为参数值,否则将引发异常。