我有一个像这样定义的路由(控制器有一个前缀/email
):
/**
* Opens send dialog
*
* @Route("/compose/{redirect_to}", name="email_compose", defaults={"redirect_to" = "/"})
* @Method({"GET", "POST"})
* @Template("EmailBundle:Email:compose.html.twig")
*/
我尝试通过javascript ajax POST调用此路由,但即使有GET请求,我也有路由错误:
http://example.com/app_dev.php/email/compose/%2Fapp_dev.php%2Fcurrent%2Fdetail%2F7
这会引发404错误:
在此服务器上找不到请求的网址/app_dev.php/email/compose//app_dev.php/current/detail/7
如果我尝试像这样简单的调用,它可以正常工作:
http://example.com/app_dev.php/email/compose/aaa
如何在作为URI的查询字符串中传递参数?
谢谢
答案 0 :(得分:2)
您应该使用POST作为方法并将重定向路由添加到formdata
谎言这个
$.ajax({
url: '/path/to/file',
type: 'POST',
data: {redirectTo: '/current/detail/7'},
})
并在控制器中解析此数据,如
$redirectTo=$this->getRequest()->get('redirectTo');
所以你不会有任何麻烦
如果你对redirectTo进行urlEncode并附加为GET参数,你也没有任何问题,例如在?
之后你可以使用与上面相同的代码检索它,但是有一个url作为路径的片段并不是太有道理了,但允许/
成为参数
http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html
答案 1 :(得分:2)
您可以在相应的路线中允许斜线,例如:
compose:
pattern: /compose/{redirectTo}
# [defaults]
requirements:
redirectTo: ".+"
相应的文档here。
但是,因为您没有尝试使用Ajax路由(在这种情况下,自定义路由是必需的),所以没有理由将目标URL作为路由参数传递。
(将其作为查询传递/compose?redirecTo=[redirectTo]
另外,正如@johnSmith所说的那样(太快了!),你应该使用POST
请求,在你的路线中要求它:
other:
pattern: /compose
# [defaults]
requirements:
methods: POST
然后,就像他说的那样检索param,并创建你的重定向。