【发布时间】:2016-08-13 10:05:57
【问题描述】:
我有一个看起来像这样的 Symfony 端点:
/**
* @Route("/test/")
*/
public function testAction(){
return new JsonResponse(['hello' => 'world']);
}
当我在启用了 HTTPS 的服务器(或 ngrok)上提供它时,以下工作:
curl https://subdomain.ngrok.io/controller/test/
它输出:
{“你好”:“世界”}
但是,当我尝试以下操作时(注意缺少的斜杠):
curl https://subdomain.ngrok.io/controller/test
我收到一个重定向网站,以及以下响应标头:
它添加了斜杠,但似乎将协议更改为 HTTP。这可以通过将@Route("/test/") 替换为@Route("/test") 来轻松解决,在这种情况下,匹配将适用于缺失和存在的尾随斜杠。但是,我宁愿确保当 Symfony 决定需要重定向时,它会维护协议。
有关于如何在任何地方强制执行 HTTPS 的教程,但这不是我感兴趣的。我需要的是 Symfony 在创建重定向时从不更改协议。我该怎么做?
编辑:更糟糕的是那些是 301 重定向。这意味着,如果曾经从浏览器访问过它,损害是相当永久性的。
编辑 2:当从 @Route 参数中删除尾部斜杠时,它会停止重定向到包含尾部斜杠的 URL,因此 .../test 将起作用。然而,即使.../test/ 不会重定向到.../test,它现在会抛出 404。所以 Symfony 会自动将斜杠附加到 URL 以进行重定向,但它不会减去它们。
【问题讨论】:
-
据我所知 symfony 不会自动删除/添加斜杠,你用什么来添加/删除斜杠?网络服务器,内核监听器?
-
我不知道。它几乎是按照自己的意愿去做的。我不记得添加了,也没有在任何配置文件中看到任何其他设置。
-
一些网络服务器重写规则?
-
不,Ngrok 和我自己的网络服务器都会发生这种情况。我有大约 98% 的把握认为 Ngrok 没有任何特殊的重写规则,尤其是因为在删除注释中的尾部斜杠时,它可以在没有重定向的情况下工作。
-
请看我的第二次编辑。
标签: php symfony redirect https trailing-slash