Цикл перенаправления в symfony2 при форсировании https

В моем приложении Symfony2 у меня установлен брандмауэр, чтобы все под /admin маршрут должен быть запущен через https, однако при развертывании я получаю цикл перенаправления. Я прочитал документацию на сайте Symfony2 по брандмауэрам и настраивал форму входа. Я также прочитал несколько статей о переполнении стека и попробовал их решения, но пока ничего.

Ниже моя конфигурация, я что-то упустил?

(Насколько я знаю, на сервере работает Apache, у меня нет прямого доступа к конфигурации сервера от моего хостинг-провайдера)

access_control:
# require ROLE_ADMIN for /admin*
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
- { path: ^/login_check, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
- { path: ^/admin*, roles: ROLE_ADMIN, requires_channel: https}

2

Решение

Исходя из вашего собственного ответа, кажется, что ваш сайт находится за балансировщиком нагрузки или обратным прокси-сервером (так как вам нужно проверить HTTP_X_FORWARDED_PROTO переменная сервера, которая обычно пуста).

Возможно, ваш хостинг-провайдер установил такую ​​настройку без вашего ведома. По умолчанию Symfony игнорирует X-Forwarded-Proto а также X-Forwarded-For заголовки, если вы добавить прокси в белый список в вашем app/config/config.yml файл:

framework:
trusted_proxies:  [127.0.0.1, ::1]

куда 127.0.0.1 а также ::1 должны быть заменены фактическими прокси / прокси, которые использует ваш хостинг-провайдер (они должны быть в состоянии сообщить вам об этом).

Это должно заставить его работать без взлома файла app.php.

2

Другие решения

Обновление: исправлена ​​проблема. Оказывается, некоторые переменные сервера не были установлены на хостинг-провайдере.

Для дальнейшего использования добавьте следующее под app.php в Интернете или в каталоге public_html. Может быть, грязный хак, но это исправило проблему для меня.

if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
{
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
5

Основываясь на правильном ответе @Oldskool, на SF> 3.3 вы можете использовать env переменные для установки trusted_proxies в SF4, а узел был удален с этой версии.

В Symfony> 3,2 <4, код такой:

# web/app.php

// BEFORE
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
$request = Request::createFromGlobals();
// ...

// AFTER
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
Request::setTrustedProxies(['192.0.0.1', '10.0.0.0/8']);
$request = Request::createFromGlobals();
// ...

Если вы на SF4, вместо этого вы можете использовать env переменные в качестве фронт-контроллера (в public/index.php) читает их.

Итак, просто добавьте env переменная TRUSTED_PROXIES вставив все доверенные прокси, разделенные запятой «,»:

TRUSTED_PROXIES = xxx.xxx.xxx.xxx/x,xxx.xxx.xxx.xxx/x,xxx.xxx.xxx.xxx/x

В качестве окончательной ссылки вы можете проверить проблема на GitHub о бесконечном цикле, вызванном принудительным https.

НА ГЕРОКУ

В качестве простой ссылки, поскольку у меня была эта проблема с Heroku

Если у вас есть проблемы заставляя https и ваше приложение на Heroku:

Вы должны следовать инструкции, предоставленные Heroku (только для SF <= 3.2):

// web/app.php

Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, null);

Для Symfony> 3.2 (инструкции здесь для SF4):

// SF >= 4: public/index.php
...
$kernel = new Kernel($env, $debug);
$request = Request::createFromGlobals();

// Add this
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);

$response = $kernel->handle($request);
...
2
По вопросам рекламы [email protected]