Symfony2具有schemes路由设置的无限重定向循环


Symfony2 Infinite Redirect Loop with schemes routing setting

我有以下带有路由注释的控制器:

/**
 * @Route("/checkout/", name="checkout", schemes = "https")
 */
public function indexAction(Request $request)
{
    //...do stuff
}

这在我的开发服务器上运行良好,但在我的生产服务器上,我得到了一个无限的重定向路由。我查看了日志,发现它是由Symfony引起的,而不是Apache。它一遍又一遍地这样做,直到我的浏览器停止:

[2014-10-28 17:32:28] request.INFO: Matched route "checkout" (parameters: "_controller": "Symfony'Bundle'FrameworkBundle'Controller'RedirectController::urlRedirectAction", "path": "/checkout/", "permanent": "true", "scheme": "https", "httpPort": "80", "httpsPort": "443", "_route": "checkout") [] []

这没有意义,因为页面通过HTTPS:请求IS

https://example.com/checkout/

我在security.yml中没有包含此内容的访问控制设置。奇怪的是,所有其他不使用"schemes="https"的控制器都能工作。

您的Symfony应用程序可能位于终止SSL(haproxy,nginx)的代理/负载均衡器后面。这些代理通常会添加一个特殊的头,告诉应用程序原始请求是通过HTTPS发送的。问题是Symfony忽略了这个头,因为它太容易被欺骗了。

要修复它,请在$request启动后将以下行添加到您的web/app.php中:

// Trust all requests as they can only come from the load balancer
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));

这将告诉Symfony,它可以信任模式标头,并且不需要重定向到HTTPS。

通过在服务器级别而不是在VirtualHost级别设置SSL配置,即使使用HTTPS,Apache也没有设置PHP服务器变量"HTTPS"。这是Symfony用来确定请求是否安全的变量。通过将各种SSL指令直接添加到我的VirtualHost条目中,问题就解决了。希望这能帮助到别人。