0

我有一个使用带有安全防火墙的 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,因此它不是我的 Web 服务器,它是当我被重定向到 /user/login 页面时。

我读到 symfony 不使用 url 中的端口,而是在 _SERVER SERVER_PORT 中定义的端口,设置

$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;

对我没有帮助。

重定向的初始请求在其标头中返回 this,

请求网址:https ://app.com/web/ 请求方法:GET 状态码:302 找到

位置:https ://app.com:80/web/user/login

有人知道如何阻止 silex 将端口 80 重定向到该位置吗?

编辑:我应该提到这是在 Redhat 的 OpenShift 云基础架构上运行的。

4

1 回答 1

3

从理论上讲,您应该能够通过在请求中设置“受信任的代理”来解决此问题,如此处所述http://symfony.com/blog/security-release-symfony-2-0-19-and-2-1- 4

不过,我在使用 CloudFlare 时遇到了这个问题,它有数百个 IP,将它们全部列为“受信任”是不切实际的,所以这是我能够解决问题的最简单方法。我把它放在自动加载器之前的引导文件顶部:

// 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;
    }
}
于 2013-02-15T02:15:34.160 回答