Einige Informationen etwas später hinzufügen, da ich auf diese Frage stieß, während ich etwas verwandte.
Ich glaube, das Status-Header-Feld ursprünglich als Teil der CGI-Spezifikation erfunden wurde, RFC 3875:
https://tools.ietf.org/html/rfc3875#section-6.3.3
zu zitieren:
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
Es ermöglicht ein CGI-Skript ein zurückzukehren Statuscode für den Webserver, der den Standard überschreibt, der in der HTTP-Statuszeile angezeigt wird. Normalerweise puffert der Server das Ergebnis des Skripts und gibt einen neuen Header für den Client aus. Dieser ist ein gültiger HTTP-Header, der mit einer geänderten HTTP-Statuszeile beginnt und das Header-Feld "Status:" des Skripts weglässt (plus einige andere Transformationen, die vom RFC beauftragt wurden).
Also alle Ihre Beispiele sind gültig von einem CGI-Skript, aber nur die erste ist wirklich gültig in einem HTTP-Header. Die letzten beiden sind nur gültig von einem CGI-Skript (oder vielleicht eine FastCGI-Anwendung).
Ein CGI-Skript kann auch im NPH-Modus (nicht geparste Kopfzeile) arbeiten, wenn es einen vollständigen und gültigen HTTP-Header generiert, den der Webserver wörtlich an den Client übergibt. Daher sollte dies kein Status: Header-Feld enthalten.
Hinweis, was mich interessiert ist, welchen Status sollte gewinnen, wenn ein NPH-Skript es ein bisschen falsch bekommt und das Status: Header-Feld, möglicherweise zusätzlich zu der HTTP-Statuszeile. Ich kann keinen klaren Hinweis finden, und ich vermute, dass es der Implementierung von allem überlassen ist, was die Ausgabe analysiert, entweder der Client oder der Server.