Добавление некоторой информации через некоторое время, так как я столкнулся с этим вопросом, исследуя что-то связанное.
Я полагаю, что поле заголовка Status было изначально изобретено как часть спецификации CGI, RFC 3875:
https://tools.ietf.org/html/rfc3875#section-6.3.3
Цитировать:
The Status header field contains a 3-digit integer result code that
indicates the level of success of the script's attempt to handle the
request.
Status = "Status:" status-code SP reason-phrase NL
status-code = "200" | "302" | "400" | "501" | extension-code
extension-code = 3digit
reason-phrase = *TEXT
Это позволяет сценарию CGI возвращать код состояния на веб-сервер, который переопределяет значение по умолчанию, отображаемое в строке состояния HTTP. Обычно сервер буферизует результат из сценария и выдает новый заголовок для клиента. Этот заголовок является действительным HTTP-заголовком, который начинается с измененной строки состояния HTTP и не содержит поля заголовка сценария «Status:» (плюс некоторые другие преобразования, предусмотренные RFC).
Таким образом, все ваши примеры действительны из CGI-скрипта , но только первый действительно действителен в заголовке HTTP. Последние два действительны только из сценария CGI (или, возможно, приложения FastCGI).
Сценарий CGI также может работать в режиме «непарсированного заголовка» (NPH), когда он генерирует полный и действительный заголовок HTTP, который веб-сервер передает клиенту дословно. Таким образом, это не должно включать поле заголовка Status: *
Обратите внимание, что меня интересует то, что должен получить статус, если скрипт NPH немного ошибается и выдает поле заголовка Status: Status, возможно, в дополнение к строке состояния HTTP. Я не могу найти какой-либо четкой индикации, и я подозреваю, что это оставлено на усмотрение того, что анализирует вывод, либо клиента, либо сервера.