コンテンツにスキップ

Statusヘッダーはどこの世界の話か

[質問]

CGIの出力で、HTTPヘッダとして "Status: 301" を出力すると、"HTTP/1.1 301" に自動変換されるというのは、どのフレームワークの話ですか

[回答] Grok

主にApache HTTP Serverのmod_cgi(またはmod_cgid)の話です。

ApacheでCGIスクリプトを実行する場合、CGIスクリプトがHTTPヘッダとして

Status: 301 Moved Permanently

のように出力すると、Apacheがこれを検知して自動的にレスポンスのステータスラインを

HTTP/1.1 301 Moved Permanently

に変換してくれます(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) の話です。