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

时间:2014-05-13 00:33:43

标签: php .htaccess symfony redirect amazon-elb

问题:

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协议生成重定向URL而不是http?

到目前为止,我已经查看了这些文档,解决方案在我的案例中没有起作用:

7 个答案:

答案 0 :(得分:21)

看看

  

供应商/ 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 :(得分:8)

  1. 确保trusted_hoststrusted_proxies配置属性设置正确。
  2. 确保您的负载均衡器将X-Forwarded-ForX-Forwarded-HostX-Forwarded-Port以及最重要的X-Forwarded-Proto标头添加到发送给应用程序的HTTP请求中。
  3. 文档:Trusting Proxies


    编辑:

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

答案 2 :(得分:2)

我在CakePHP应用程序中使用AWS和ELB以及SSL的PHP​​应用程序遇到了完全相同的问题。

我的解决方案在某些方面表现良好而在其他方面表现不佳。问题是,Amazon发送的HTTPS标头与您查找的PHP标头不同:$_SERVER['HTTPS']已关闭,而Amazon发送可用于识别其实际上在HTTPS下运行的备用HTTPS标头:

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

我发现Cake内部定义的基本URL常量中包含http协议,因此我只是在$_SERVER['HTTPS']文件的第一行重新定义了index.php变量在蛋糕中 - 如果你能在symfony做同样的话,我不会感到惊讶:)

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

这允许我的应用程序继续运行,检测HTTPS是否正在' on'正如通常预期的那样,允许Cake在我的基本URL常量内部管理协议。

好:

  • 立即修复问题
  • 使用了3行代码

为:

  • 每当我升级我的Cake核心时,我都不得不重新把它放回去

答案 3 :(得分:0)

  

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

您需要显式配置HTTPS协议,因为仅通过检测,Symfony2将仅猜测HTTP,因为HTTP用作应用程序的传输协议

因此,对于创建重定向URI的组件,您需要注入HTTPS基URI-Scheme。一种简单的方法是将base-URI配置为参数,然后配置在配置中。

给出示例代码

答案 4 :(得分:0)

你使用绝对网址进行重定向吗?当我们在重定向上使用相对URL时,我在myracloud背后遇到了类似的问题。 myracloud"固定"它使它绝对,但失去了协议。

答案 5 :(得分:0)

我已经在我的.htaccess中解决了这种问题,它有一个缺点,它总是重定向到https也不在S2防火墙后面,这在我的情况下是好的,因为我只有公开的登录表单我想要要通过https

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

答案 6 :(得分:0)

上述解决方案对我不起作用。我在我的web/app.php中添加了以下代码行(如Symfony2的文档http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly中所示):

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

之后

$request = Request::createFromGlobals();

在Symfony 2.5中解决了我的问题。