Выпуск:
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?
До сих пор я рассматривал эти документы, и решение не работало в моем случае:
Взгляни на
поставщик / 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', );
trusted_hosts
и trusted_proxies
установлены соответствующим образом. 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.
Как заставить 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.