ELB背后的Symfony2正在重定向到http而不是https

2022-08-30 15:43:52

问题:

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

环境架构:

enter image description here

Server1 和 Server2 拥有 Symfony2 应用程序。

问题:

如何强制Symfony使用https协议而不是http生成重定向URL?

到目前为止,我已经查看了这些文档,并且该解决方案在我的情况下不起作用:


答案 1

看看

vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Request.php

AWS ELB 的使用HTTP_X_FORWARDED_PROTO和HTTP_X_FORWARDED_PORT而 Symfony 看起来X_FORWARDED_PROTO,X_FORWARDED_PORT标头来判断连接及其安全状态。

您可以尝试在受信任的Headers中更改这些密钥,尽管我不建议直接更改它们,而是找到一种方法来覆盖它们。

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


答案 2
  1. 确保正确设置了和配置属性。trusted_hoststrusted_proxies
  2. 确保负载均衡器将 、 和最重要的标头添加到发送到应用程序的 HTTP 请求中。X-Forwarded-ForX-Forwarded-HostX-Forwarded-PortX-Forwarded-Proto

文档:信任代理


编辑:

正如@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');

推荐