Statusヘッダーはどこの世界の話か
[質問]
CGIの出力で、HTTPヘッダとして "Status: 301" を出力すると、"HTTP/1.1 301" に自動変換されるというのは、どのフレームワークの話ですか
[回答] Grok
主にApache HTTP Serverのmod_cgi(またはmod_cgid)の話です。
ApacheでCGIスクリプトを実行する場合、CGIスクリプトがHTTPヘッダとして
のように出力すると、Apacheがこれを検知して自動的にレスポンスのステータスラインを
に変換してくれます(Statusヘッダ自体は最終的な出力からは消えます)。
これはApacheの仕様で、CGI/1.1仕様(RFC 3875)には厳密には書かれていない「Apache独自の拡張」ですが、非常に広く使われている挙動です。
よく見る具体例(Perl CGIの場合)
print "Status: 301 Moved Permanently\n";
print "Location: https://example.com/newpage\n";
print "\n"; # ヘッダとボディの区切り
↑ これでApacheがちゃんと301リダイレクトしてくれる。
他のWebサーバーではどうか(参考)
- nginx → 基本的にStatus: ヘッダを無視する(301にならない)
- lighttpd → 昔は似た挙動があったが最近はあまり推奨されない
- IIS → Statusではなく
Response.Status = "301 ..."のようなAPIを使う - 多くの最近のフレームワーク(Rails, Django, Laravelなど)→ もうCGIとして動かすことはほぼないので、この挙動に依存しない
つまり「CGIでStatus: 301を出力すると自動でHTTP/1.1 301になる」という話は、ほぼApache + mod_cgiの文脈で語られることが圧倒的に多いです。
まとめると
→ Apache HTTP Server(特にmod_cgi / mod_cgid) の話です。