Назад | Перейти на главную страницу

500 внутренний сервер - AH02429: имя заголовка ответа

ОС Ubuntu Ubuntu 16.04.2 LTS Apache / 2.4.18 Perl v5.22.1

Итак, у меня есть код Perl, который читает базу данных mysql, а затем создает динамическую веб-страницу. Код отлично работает годами. Неделю назад мой клиент звонит и говорит, что получает сообщение внутреннего сервера 500. Я смотрю, все в порядке, но когда я пытаюсь загрузить страницу, я получаю ошибку 500. В журнале ошибок apache есть такая ошибка:

[Tue May 30 22:16:13.144199 2017] [http:error] [pid 12487] [client 99.99.99.99:55628] AH02429: Response header name '<!-- warning' contains invalid characters, aborting request

Кто-нибудь видел это или имеет какое-либо представление о причинах этого?

У вас есть заголовок ключа с недопустимыми символами, это не было проблемой до исправления системы безопасности CVE-2016-8743.

https://blog.tigertech.net/posts/apache-cve-2016-8743/

В моем случае это был Apache + PHP и пробел перед ":", например "X-CUSTOM-KEY:", и я не нашел другого решения, кроме изменения заголовка.

У меня была эта проблема с java-приложением с ошибками, которое возвращало «Местоположение: http://foo.bar\ n "(обратите внимание, что \n в конце).

У меня не было доступа к исходному коду приложения для решения проблемы, поэтому мне пришлось найти обходной путь, сказав apache исправить заголовки, используя mod_header

Решение было:

      Header edit Location "\n$" ""

Провел несколько тестов, создал приложение, которое вернуло <!-- warning: teste заголовок и решил его на apache с помощью следующей директивы:

      Header always unset "<!-- warning"

Если вы не можете исправить приложение, apache может удалить / исправить заголовок за вас.

Как сообщает @GroGz, эта проблема почти наверняка вызвана (или, скорее, обнаружена) исправлением CVE-2016-8743 - синтаксический анализ заголовков HTTP стал гораздо более строгим в обновлении Apache, выпущенном 20 декабря 2016 г. (подробности см. https://httpd.apache.org/security/vulnerabilities_24.html). Вероятно, ваш Perl-скрипт использует модуль CGI::Carp который включает подпрограмму "warningsToBrowser". Эта подпрограмма помещает предупреждения, вызванные проблемами кода, в комментарии HTML, встроенные в выходные данные вашей программы, а не просто записывает их в журналы HTTPD. Эта подпрограмма запускается следующим образом:

warningsToBrowser(1);

Если вы активируете его до того, как HTTP-заголовки будут отправлены полностью, вы увидите ошибку, аналогичную описанной вами.

Простое решение - поиск в вашем коде любого появления:

warningsToBrowser(1);

и измените его на:

warningsToBrowser(0);

При этом предупреждающие сообщения будут отправляться только на STDERR (как и большинство серверов HTTPD, Apache направит STDERR в журнал ошибок сервера). Поскольку вы говорите «код отлично работает в течение многих лет», скорее всего, предупреждения в любом случае не слишком серьезны. Проверять, выписываться http://perldoc.perl.org/5.8.9/CGI/Carp.html#MAKING-WARNINGS-APPEAR-AS-HTML-COMMENTS для получения дополнительной информации.

Проблема возникает из-за пустого списка заголовков, который в symfony 1.4 выглядит как

array(1) {
 [""] => string(9) "text/html"
}

Проблему можно решить, изменив строку 357 в lib / response / sfWebResponse.class.php на

foreach ($this->headers as $name => $value)
{
  if($name === "")
    $name = "Content-type";

  header($name.': '.$value);

  [...]

На самом деле я не знаю, почему не указано собственное имя, но проект слишком стар, чтобы копаться в фреймворке.