SSL终止ElasticBeanstalk Symfony

时间:2016-03-03 03:13:28

标签: php symfony ssl elastic-beanstalk

我有一个需要https或某些页面的应用程序。

我正在尝试使用ElasticBeanstalk(EB)部署Symfony应用程序。 EB具有此功能,它将每个请求http或https请求作为http传递给EC2实例,并使用HTTP_X_FORWARDED_PORT和HTTP_X_FORWARDED_PROTO让EC2实例知道原始请求协议是什么。根据Symfony文档,我可以做这样的事情。

Request::setTrustedProxies(['127.0.0.1', $request->server->get('REMOTE_ADDR')]);
Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'HTTP_X_FORWARDED_FOR');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'HTTP_HOST');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'HTTP_X_FORWARDED_PORT');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'HTTP_X_FORWARDED_PROTO');

并且在控制器中我定义了这样的方案。

/**
 *
 * @Route("/products", schemes = { "https" })
 */
 class ProductsController extends Controller
 {
    /**
     * @Route("/{id}", name="show_product", schemes = { "https" })
     * @Method("GET")
     *
     * @return Response A HTTP response
     */
    public function index($id, Request $request)

但它导致来自https的永无止境的循环 - > http - > HTTPS。有没有办法解决这个问题。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我在这里发布解决方案,以便其他人可以从中受益。实际上,Symfony会查找HTTP标头而不是服务器标头,因此映射应该是这样的。

Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_FORWARDED_FOR');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'HTTP_HOST');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_FORWARDED_PORT');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_FORWARDED_PROTO');