PHP header()で設定されるステータスコード
このページは、PHPの header() で設定される、レスポンスのステータスコードについて調査した内容を記載するページです。
注意
- このページに記載してある内容はPHP 8.1.6時点の内容です。将来のバージョンでは仕様が変更されているかもしれません。
設定されるステータスコード
おおまかな条件 | 設定されるステータスコード |
---|---|
header('Location: ...'); かつ、該当のheader() を呼び出す以前に指定したステータスコードが201, 3XX以外 (未指定含む) |
302 |
header('WWW-Authenticate: ...'); |
401 |
header('...', trueまたはfalse, ステータスコード); |
指定したステータスコード |
上記以外 | 設定されない (更新されない) |
該当ソース
} else if (!strcasecmp(header_line, "Location")) {
if ((SG(sapi_headers).http_response_code < 300 ||
SG(sapi_headers).http_response_code > 399) &&
SG(sapi_headers).http_response_code != 201) {
/* Return a Found Redirect if one is not already specified */
if (http_response_code) { /* user specified redirect code */
sapi_update_response_code(http_response_code);
} else if (SG(request_info).proto_num > 1000 &&
SG(request_info).request_method &&
strcmp(SG(request_info).request_method, "HEAD") &&
strcmp(SG(request_info).request_method, "GET")) {
sapi_update_response_code(303);
} else {
sapi_update_response_code(302);
}
}
} else if (!strcasecmp(header_line, "WWW-Authenticate")) { /* HTTP Authentication */
sapi_update_response_code(401); /* authentication-required */
}
if (sapi_header.header==header_line) {
*colon_offset = ':';
}
※ SG(request_info).proto_num
が1000を超え (≒リクエストされたHTTPのバージョンが1.1 (1001) 以上) 、リクエストメソッドがHEADかGET以外(POSTやPUTなど)だと303になる条件がありますが、apache2handlerだとここではリクエストされたHTTPのバージョンがいくつでも1000で処理されているようなのでステータスコードが自動的に303になることは無いようです。1
(header()
の第3引数などで303を指定していれば303になります。また、他のSAPIだとこの時点でproto_numが1000を超える場合があるかもしれません(未調査))
-
https://github.com/php/php-src/blob/PHP-8.1.6/main/SAPI.c#L448 の
sapi_activate()
からこの処理まででproto_numを変更している箇所がおそらくありません。https://github.com/php/php-src/blob/PHP-8.1.6/sapi/apache2handler/sapi_apache2.c#L160 は最終的なレスポンス出力時に処理されるようです。該当のSG(request_info).proto_num > 1000 &&
を削除して自力でビルドした場合は、リクエストメソッドがPOSTのときにheader('Location: ...');
を使うと303になります。 ↩︎