<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class ForceHttpsFromProxySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 2048],
];
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
if ($request->isSecure()) {
return;
}
$forwarded = strtolower((string) $request->headers->get('forwarded', ''));
$xForwardedProto = strtolower((string) $request->headers->get('x-forwarded-proto', ''));
$xForwardedSsl = strtolower((string) $request->headers->get('x-forwarded-ssl', ''));
$xUrlScheme = strtolower((string) $request->headers->get('x-url-scheme', ''));
$frontEndHttps = strtolower((string) $request->headers->get('front-end-https', ''));
$isHttpsFromProxy =
str_contains($forwarded, 'proto=https')
|| str_contains($xForwardedProto, 'https')
|| 'on' === $xForwardedSsl
|| 'https' === $xUrlScheme
|| 'on' === $frontEndHttps;
if (!$isHttpsFromProxy) {
return;
}
$request->server->set('HTTPS', 'on');
$request->server->set('SERVER_PORT', 443);
}
}