Почему Apache + Rails выделяет два заголовка статуса для кода 500? - PullRequest
4 голосов
/ 02 октября 2008

У меня есть приложение rails, которое работает нормально, кроме одной вещи.

Когда я запрашиваю что-то, что не существует (то есть /not_a_controller_or_file.txt), и rails генерирует исключение «Нет совпадений маршрутов ...», ответом является (пустая строка преднамеренно):

HTTP/1.1 200 OK
Date: Thu, 02 Oct 2008 10:28:02 GMT
Content-Type: text/html
Content-Length: 122
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive

Status: 500 Internal Server Error
Content-Type: text/html

<html><body><h1>500 Internal Server Error</h1></body></html>

У меня есть плагин ExceptionLogger в / vendor, хотя, похоже, это не проблема. Я не добавил публичной обработки ошибок, кроме пользовательского 500.html (хотя ответ не содержит этот HTML), и я понятия не имею, откуда взялся этот бит html.

Так что-то, где-то добавляется, что HTTP / 1.1 200 код статуса слишком рано, или Статус: 500 слишком поздно. Я подозреваю, что это Apache, потому что я получаю соответствующий заголовок HTTP / 1.1 500 (вверху), когда использую Webrick.

Мой производственный стек выглядит следующим образом: Apache 2 Дворняга (5 экземпляров) RubyOnRails 2.1.1 (происходит как в 1.2, так и в 2.1.1)


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

Ответы [ 3 ]

2 голосов
/ 21 апреля 2010

Это довольно старая ветка, но за то, что она того стоит, я нашел отличный ресурс, который включает в себя подробное описание проблемы и решения. Очевидно, эта ошибка влияет на Rails <2.3 при использовании с Mongrel. </p>

1 голос
/ 02 октября 2008

Этот HTML-файл исходит от Rails. Он сталкивается с какой-то ошибкой (возможно, исключение какого-либо рода или какая-то другая неисправимая ошибка).

Если есть лишняя пустая строка между заголовком Status: и фактическими заголовками, а не просто опечатка, то это будет в значительной степени объяснять, почему Apache сообщает о сообщении 200 OK.

Заголовок Status - это то, как Rails, PHP или что-то еще говорит Apache: «Произошла ошибка, пожалуйста, верните этот код вместо 200 OK». Факт наличия пустой строки означает, что происходит что-то дополнительное, и Ruby выводит пустую строку перед выводом ошибки по любой причине. Может быть, это предыдущий вывод из вашего скрипта. Короче говоря, лишняя пустая строка означает, что Apache думает: «О, пустая строка, никаких дополнительных заголовков, это все содержимое сейчас». Это соответствует согласованному вами заголовку Content-Length.

Я предполагаю, почему пустая строка будет выводом предыдущего скрипта, возможно, строкой, заканчивающейся в конце страницы полностью скрипта. Относительно того, почему происходит ошибка 500, здесь недостаточно информации, чтобы сказать вам это. Возможно ошибка ввода-вывода файла.

Редактировать: Учитывая дополнительную информацию, предоставленную Дейвом о внутренних органах, я бы сказал, что это на самом деле проблема с прокси-сервером, который происходит за кулисами ... Я не могу сказать вам точно что, кроме того, что уже было сказано.

0 голосов
/ 12 октября 2008

Это исходит от самих рельсов.

http://github.com/rails/rails/tree/master/actionpack/lib/action_controller/dispatcher.rb#L60

Диспетчер возвращает страницу с ошибкой с кодом состояния 200 (Успешно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...