Symfony2 за ELB перенаправляет на http вместо https

Выпуск:

  • Пользователь регистрируется с помощью https://example.com/login
  • Аутентификация одобрена
  • Как настроено в security.yml Symfony2 перенаправляет пользователя на страницу профиля после входа в систему.
  • Но он перенаправляет их на неправильный URL http://example.com/homepage

security.yml :

security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] providers: fos_userbundle: id: fos_user.user_provider.username_email firewalls: main: pattern: ^/ form_login: check_path: /login_check login_path: /login default_target_path: /profile provider: fos_userbundle logout: path: /logout target: /splash anonymous: ~ access_control: - { roles: ROLE_USER, requires_channel: https } - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } acl: connection: default 

Архитектура окружающей среды:

введите описание изображения здесь

Сервер1 и Server2 содержат приложение Symfony2.

Вопрос:

Как заставить Symfony генерировать URL перенаправления с протоколом https вместо http?

До сих пор я рассматривал эти документы, и решение не работало в моем случае:

  • http://symfony.com/doc/current/cookbook/routing/scheme.html

Related of "Symfony2 за ELB перенаправляет на http вместо https"

Взгляни на

поставщик / Symfony / Symfony / SRC / Symfony / Компонент / HttpFoundation / Request.php

AWS ELB использует HTTP_X_FORWARDED_PROTO и HTTP_X_FORWARDED_PORT, в то время как Symfony рассматривает заголовки X_FORWARDED_PROTO и X_FORWARDED_PORT, чтобы судить о соединении и его безопасном статусе.

Вы можете попробовать изменить эти ключи в trustedHeaders, хотя я бы не рекомендовал их напрямую изменять, но нашел способ их переопределить.

 protected static $trustedHeaders = array( self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR', self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST', self::HEADER_CLIENT_PROTO => 'HTTP_X_FORWARDED_PROTO', self::HEADER_CLIENT_PORT => 'HTTP_X_FORWARDED_PORT', ); 

Ссылка – http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

  1. Убедитесь, что свойства конфигурации trusted_hosts и trusted_proxies установлены соответствующим образом.
  2. Убедитесь, что ваш балансировщик нагрузки добавляет X-Forwarded-For , X-Forwarded-Host , X-Forwarded-Port и, что самое главное, заголовки X-Forwarded-Proto для HTTP-запроса, отправляемые в приложение.

Документация: доверяющие прокси .


РЕДАКТИРОВАТЬ:

Как и @ A23, вы также должны проверить, использует ли ELB «стандартные» заголовки заголовков. Если нет, замените их одним из следующих:

 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X-Proxy-For'); Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X-Proxy-Host'); Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X-Proxy-Port'); Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X-Proxy-Proto'); 

У меня была такая же проблема с приложением PHP с использованием AWS и ELB с SSL в приложении CakePHP.

Мое решение было хорошим в некоторых отношениях и плохим в других. Проблема заключалась в том, что Amazon отправляет разные заголовки HTTPS, чем заголовки PHP, которые вы ищете: $_SERVER['HTTPS'] выключен, а Amazon отправляет альтернативные заголовки HTTPS, которые вы можете использовать, чтобы определить, что он фактически работает под HTTPS:

 $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' 

Я выяснил, что моя базовая константа URL, которую внутри Cake определила внутри, имела в ней протокол http , поэтому я просто переопределил переменную $_SERVER['HTTPS'] в самой первой строке моего файла index.php в Cake – и я бы не хотел, не удивляйтесь, если вы можете сделать то же самое в symfony):

 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } 

Это позволило моему приложению продолжить работу, обнаружить HTTPS как «включен», как обычно ожидалось, и позволить Cake внутренне управлять протоколом в моей базовой константе URL.

Хорошо:

  • немедленно устранена проблема
  • использовали 3 строки кода

Плохо:

  • всякий раз, когда я обновляю ядро ​​Cake, мне придется снова вставить это обратно

Как заставить Symfony генерировать URL перенаправления с протоколом https вместо http?

Вам нужно явно настроить протокол HTTPS, потому что только с помощью обнаружения Symfony2 будет только гадать HTTP, поскольку HTTP используется в качестве транспортного протокола для приложения .

Поэтому для компонента, который создает URI перенаправления, вам нужно ввести базовую URI-схему HTTPS. Один простой способ сделать это – настроить базовый URI в качестве параметра, а затем в пределах конфигурации.

Приводятся примеры кодов

вы используете абсолютный URL для перенаправления? Я столкнулся с аналогичной проблемой позади myracloud, когда мы использовали относительные URL-адреса для перенаправления. myracloud «исправил» его и сделал его абсолютным, но потерял протокол.

Я решил эту проблему в моем .htaccess, у нее есть недостаток, что она всегда перенаправляет на https также не позади брандмауэра S2, что хорошо в моем случае, так как у меня есть только форма входа в систему, и я хочу, чтобы учетные данные были отправляться через https

  RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{SERVER_NAME}/$1 [redirect=permanent,last] 

Вышеупомянутые решения для меня не сработали. Я добавил следующую строку кода (как предложено в документах Symfony2 http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html#but-what-if-the-ip-of-my-reverse-proxy -изменяет-постоянно ) к моему web/app.php :

 Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR'))); 

сразу после

 $request = Request::createFromGlobals(); 

Это решило проблему для меня в Symfony 2.5.