问题:
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
环境架构:
Server1和Server2拥有Symfony2应用程序。
问题:
如何强制Symfony使用https协议生成重定向URL而不是http?
到目前为止,我已经查看了这些文档,解决方案在我的案例中没有起作用:
答案 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',
);
答案 1 :(得分:8)
trusted_hosts
和trusted_proxies
配置属性设置正确。X-Forwarded-For
,X-Forwarded-Host
,X-Forwarded-Port
以及最重要的X-Forwarded-Proto
标头添加到发送给应用程序的HTTP请求中。文档: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 :(得分: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中解决了我的问题。