Symfony 尾部斜杠重定向丢弃 HTTPS

Symfony Trailing Slash Redirection Drops HTTPS

我有一个看起来像这样的 Symfony 端点:

/**
 * @Route("/test/")
 */
public function testAction(){
    return new JsonResponse(['hello' => 'world']);
}

当我在我的 HTTPS-enabled 服务器(或 ngrok)上提供它时,以下工作:

curl https://subdomain.ngrok.io/controller/test/

它输出:

{"hello":"world"}

但是,当我尝试以下操作时(注意缺少的尾部斜杠):

curl https://subdomain.ngrok.io/controller/test

我收到一个重定向网站,响应如下header:

Location: http://subdomain.ngrok.io/controller/test/

它添加了尾部斜杠,但似乎将协议更改为 HTTP。这可以通过将 @Route("/test/") 替换为 @Route("/test") 轻松解决,在这种情况下,匹配将适用于缺失和存在的尾部斜杠。但是,我宁愿确保每当 Symfony 决定需要重定向时,它都会维护协议。

有关于如何在所有地方强制执行 HTTPS 的教程,但这不是我感兴趣的。我需要的是 Symfony 在创建重定向时永远不会 更改 协议.我该怎么做?

编辑:更糟糕的是那些是 301 重定向。这意味着如果从浏览器访问它,损害是相当永久的。

编辑 2:从 @Route 参数中删除尾部斜杠时,它会停止重定向到包含尾部斜杠的 URL,因此 .../test 将起作用。然而,即使 .../test/ 不会重定向到 .../test,它现在会抛出 404。因此 Symfony 会自动将斜杠附加到 URL 以进行重定向,但不会减去它们。

我认为您的问题与 Request object 上的 trustedProxies 值有关。 Symfony 不监听 HTTP 代理转发 headers(特别是 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