PHP header()で設定されるステータスコード

このページは、PHPの header() で設定される、レスポンスのステータスコードについて調査した内容を記載するページです。

注意

  • このページに記載してある内容はPHP 8.1.6時点の内容です。将来のバージョンでは仕様が変更されているかもしれません。

設定されるステータスコード

おおまかな条件 設定されるステータスコード
header('Location: ...'); かつ、該当のheader()を呼び出す以前に指定したステータスコードが201, 3XX以外 (未指定含む) 302
header('WWW-Authenticate: ...'); 401
header('...', trueまたはfalse, ステータスコード); 指定したステータスコード
上記以外 設定されない (更新されない)

該当ソース

https://github.com/php/php-src/blob/PHP-8.1.6/main/SAPI.c#L796
} 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を超える場合があるかもしれません(未調査))


  1. https://github.com/php/php-src/blob/PHP-8.1.6/main/SAPI.c#L448sapi_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になります。 ↩︎