【问题标题】:Silex redirects adding port 80 to locationSilex 重定向将端口 80 添加到位置
【发布时间】:2013-02-15 01:53:26
【问题描述】:

我有一个使用带有安全防火墙的 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;

对我没有帮助。

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

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

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

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

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

【问题讨论】:

  • Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR'))); 不适合你吗?
  • @Jack 好像不是,我是这样设置 Request::setTrustedProxies(array($_SERVER['REMOTE_ADDR']));

标签: php symfony silex openshift


【解决方案1】:

理论上,您应该能够通过在请求中设置“受信任的代理”来解决此问题,如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;
    }
}

【讨论】:

  • 嗨 MDrollette,感谢您提供的信息。我在想我的问题是类似的。我应该提到我部署在 Redhat 的 OpenShift PaaS 上。
  • 该死的我做对了!我也添加了设置 HTTP_X_FORWARDED_PORT 但我正在编辑我的本地副本而不是部署的版本。太业余了!
  • 我在 Codeigniter 中专门为此目的使用了一个非常相似的 hack。
  • 我在 CloudFlare、Nginx 和 Ruby on Rails 使用瘦服务器时遇到了这个问题。您可能也没有合适的解决方案?
猜你喜欢
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2018-05-07
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多