В моем приложении 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}
Исходя из вашего собственного ответа, кажется, что ваш сайт находится за балансировщиком нагрузки или обратным прокси-сервером (так как вам нужно проверить 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.
Обновление: исправлена проблема. Оказывается, некоторые переменные сервера не были установлены на хостинг-провайдере.
Для дальнейшего использования добавьте следующее под app.php
в Интернете или в каталоге public_html. Может быть, грязный хак, но это исправило проблему для меня.
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
{
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
Основываясь на правильном ответе @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);
...