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:
它添加了尾部斜杠,但似乎将协议更改为 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.php
或 app.php
,应该可以解决 ngrok 的问题。
if ($debug) {
Request::setTrustedProxies(
[$_SERVER['REMOTE_ADDR']],
Request::HEADER_X_FORWARDED_PROTO
);
}
有关选项的详细信息,请参阅 http://symfony.com/doc/current/deployment/proxies.html。
我有一个看起来像这样的 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:
它添加了尾部斜杠,但似乎将协议更改为 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.php
或 app.php
,应该可以解决 ngrok 的问题。
if ($debug) {
Request::setTrustedProxies(
[$_SERVER['REMOTE_ADDR']],
Request::HEADER_X_FORWARDED_PROTO
);
}
有关选项的详细信息,请参阅 http://symfony.com/doc/current/deployment/proxies.html。