我有一个需要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。有没有办法解决这个问题。
答案 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');