от $_SERVER
массив php:
$_SERVER['APP_ENV'] prod
$_SERVER['APP_DEBUG'] 0
$_SERVER['TRUSTED_PROXIES'] 172.16.0.0/12
$_SERVER['HTTP_X_FORWARDED_FOR'] XXX.XXX.XXX.XXX
$_SERVER['HTTP_X_FORWARDED_HOST'] my.website.com
$_SERVER['HTTP_X_FORWARDED_PORT'] 443
$_SERVER['HTTP_X_FORWARDED_PROTO'] https
из заголовков HTTP:
X-Forwarded-For XXX.XXX.XXX.XXX
X-Forwarded-Host my.website.com
X-Forwarded-Port 443
X-Forwarded-Proto https
в src/public/index.php
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) {
Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}
в /src/Controller/TestController.php
class TestController
{
public function index(Request $request)
{
$response = new Response();
$response->setContent( $request->getScheme() );
return $response;
}
}
выход
http
но ожидаемый результат
https
почему Symfony возвращает неправильную схему http?
У вас есть такой же вывод, когда вы используете абстрактный класс AbstractController
?
подобно class TestController extends AbstractController
Проблема исходит из неверного заголовка HTTP_X_FORWARDED_PROTO
возвращено Трафиком
Symfony признать FORWARDED
или X_FORWARDED_PROTO
Исходный код (для symfony 3.4 (устаревший код удален в 4.x)
protected static $trustedHeaders = array(
self::HEADER_FORWARDED => 'FORWARDED',
self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
);
В соответствии с эта документация вы должны установить правильные доверенные прокси в файле public / index.php, как это (AWS ELB включен, который распознает HTTP_X_FORWARDED_PROTO
...
$kernel = new Kernel($env, $debug);
$request = Request::createFromGlobals();
// tell Symfony about your reverse proxy
Request::setTrustedProxies(
// the IP address (or range) of your proxy
['192.0.0.1', '10.0.0.0/8'],
// trust *all* "X-Forwarded-*" headers
// Request::HEADER_X_FORWARDED_ALL
// or, if your proxy instead uses the "Forwarded" header
// Request::HEADER_FORWARDED
// or, if you're using AWS ELB
Request::HEADER_X_FORWARDED_AWS_ELB
);
...