我有一个使用Silex和安全防火墙的应用程序。当我在https://app.com/web加载我的应用并且我未经过身份验证时,我会被重定向到https://app.com:80/web/user/login_check
这会产生SSL错误,因为我试图在非ssl端口上建立ssl连接。
我的防火墙配置如下所示,
$app['security.firewalls'] = array(
'login' => array(
'pattern' => '^/user/login$',
),
'admin' => array(
'pattern' => '^.*$',
'form' => array('login_path' => '/user/login', 'check_path' => '/user/login_check'),
'logout' => array('logout_path' => '/user/logout'),
'users' => array(
// raw password is demo
'test' => array('ROLE_ADMIN', 'qldD7MO0Ol7e2LijC1qdNxQJpkIdHQLPjHUM0rN/N6AjEHqGzZFsYPh94R/AeFrM8aEt9Y6L$
),
),
);
我知道我可以在没有添加端口的情况下访问https://app.com/web/index.php,因此它不是我的网络服务器,当我被重定向到/ user / login页面时。
我读到symfony不使用url中的端口,而是使用_SERVER SERVER_PORT中定义的端口,设置
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
不帮助我。
重定向的初始请求会在其标题中返回此内容,
请求网址:https://app.com/web/ 请求方法:GET 状态代码:302找到
位置:https://app.com:80/web/user/login
有人知道如何阻止silex的重定向将端口80添加到该位置吗?
编辑:我应该提到这是在Redhat的OpenShift云基础架构上运行的。
答案 0 :(得分:3)
理论上,您应该能够通过在请求中设置“受信任代理”来解决此问题,如此处所述http://symfony.com/blog/security-release-symfony-2-0-19-and-2-1-4
我在使用CloudFlare时遇到了这个问题,但是它有数百个IP,将它们全部列为“可信”是不切实际的,所以这是我能够解决问题的最简单方法。我把它放在autoloader之前的bootstrap文件的顶部:
// Fix IP for cloudflare
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$_SERVER['HTTP_X_FORWARDED_FOR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
// Fix SSL for cloudflare
if (isset($_SERVER['HTTP_CF_VISITOR'])) {
if (preg_match('/https/i', $_SERVER['HTTP_CF_VISITOR'])) {
$_SERVER['HTTPS'] = 'On';
$_SERVER['HTTP_X_FORWARDED_PORT'] = 443;
$_SERVER['SERVER_PORT'] = 443;
}
}