【问题标题】:qdPM Symfony 1.4 500 Internal server error - Empty response header name, aborting requestqdPM Symfony 1.4 500 Internal server error - Empty response header name, aborting request
【发布时间】:2018-01-17 16:23:21
【问题描述】:

一年多以来,我一直在 Centos 6.7 服务器上使用 qdPM v9.0(来自 qdpm/core/apps/qdPM/config/app.yml)和 PHP 7.0.6 和 apache 2.2.x 和 MariaDB 5.5.x现在没有任何问题。 它似乎使用的是旧版 Symfony 1.4。

我尝试安装 Let's Encrypt SSL 证书,并将 Apache/httpd 升级到 2.2.15,PHP 或 MariaDB 版本没有变化。

在安装 SSL 证书后重新启动 httpd 时,突然出现 500 Internal Server Error 并且 httpd 错误日志显示:

...
[Wed Aug 09 14:55:22 2017] [error] [client x.x.x.x] Empty response header name, aborting request
[Wed Aug 09 14:55:32 2017] [error] [client x.x.x.x] Empty response header name, aborting request
...

此外,这不是 SSL/Apache 的错误配置,因为其他子域上的其他应用程序在使用和不使用 Let's Encrypt SSL 证书的情况下都可以继续正常工作。

除了一些德国讨论建议使用 PHP 5.3 外,Google 没有提供帮助: https://www.php.de/forum/webentwicklung/php-frameworks/1508593-installation-symfony-framework

Symfony 1 geht nur mit maximal PHP 5.3... Deswegen sagte ich doch hol dir Symfony 3!!!

我多次清除缓存。 我删除了所有 Let's Encrypt SSL 配置以及恢复旧的自签名 SSL 证书并将 Apache 配置恢复到早期的工作状态。

因为我们每天都进行备份,所以我什至恢复了几个小时前的整个代码备份。

这肯定行得通。

我仍然遇到同样的错误,并且没有关于如何调试它的线索/提示。 Symfony 日志记录文档是针对当前版本的,而不是针对 1.4 的

什么可能导致了这个问题?

如何启用调试,以便我可以找到错误“Empty response header name”的创建位置,以便我可以修补它?

【问题讨论】:

    标签: php apache debugging http-headers symfony-1.4


    【解决方案1】:

    我修改了函数,它可以工作了:(php 7.0+)

    .../core/lib/vendor/symfony/lib/response/sfWebResponse.class.php 第 407 行

    /** * Retrieves a normalized Header. * * @param string $name Header name * * @return string Normalized header */ protected function normalizeHeaderName($name) { $out = []; array_map(function($record) use (&$out) { $out[] = ucfirst(strtolower($record)); }, explode('-',$name)); return implode('-',$out); }

    【讨论】:

    • 超级老,我知道,但这应该是公认的答案 Gábor 值得为此加分
    【解决方案2】:

    这个版本也很好用:

      /**
       * Retrieves a normalized Header.
       *
       * @param  string $name  Header name
       *
       * @return string Normalized header
       */
      protected function normalizeHeaderName($name)
      {
        return preg_replace_callback('/\-(.)/', function ($matches) { return '-'.strtoupper($matches[1]); }, strtr(ucfirst(strtolower($name)), '_', '-'));
      }
    

    【讨论】:

      【解决方案3】:

      我能够将问题追溯到发送的标头

      core/lib/vendor/symfony/lib/response/sfWebResponse.class.php 
      on line 357
      

      值有问题。

      qdPM 9.0 在 PHP7 上运行良好一年多,直到 Ubuntu 16.04 的 Apache 2 更新出现。

      但是,我发现了问题:

      E_WARNING: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in 
      .../core/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 409
      

      但我不明白旧线:

      return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
      

      已转换,以便它可以工作。据我了解,它将用大写字母替换破折号后面的任何内容。但我无法让它与preg_replace_callback一起工作:

      return preg_replace_callback('\-(.)', function($m) { return '-'.strtoupper($m[1]); } , strtr(ucfirst(strtolower($name)), '_', '-'));
      

      匿名函数根本不会被调用。我已经完全删除了 preg 替换,现在它工作正常。也许我们会在这里得到如何正确解决它的更新。

      【讨论】:

      • 感谢您的回答。无论如何,我通过将 PHP 版本从 7.0 恢复到 5.6 来解决我的问题
      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 2020-03-28
      • 2023-03-30
      • 1970-01-01
      • 2015-08-16
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多