【问题标题】:Symfony Trailing Slash Redirection Drops HTTPSSymfony 尾部斜杠重定向丢弃 HTTPS
【发布时间】: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://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


【解决方案1】:

我相信您的问题与 Request 对象上的 trustedProxies 值有关。 Symfony 不会监听 HTTP 代理转发标头(特别是 X-Forwarded-Proto),除非代理列在受信任的代理中。

将此添加到您的 Symfony index.phpapp.php,应该可以解决 ngrok 的问题。

if ($debug) {
    Request::setTrustedProxies(
        [$_SERVER['REMOTE_ADDR']],
        Request::HEADER_X_FORWARDED_PROTO
    );
}

有关选项的更多信息,请参阅http://symfony.com/doc/current/deployment/proxies.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多