Principalmente veo que el código de respuesta se establece así:

header('HTTP/1.1 404 Not Found');

Pero lo siguiente también parece funcionar bien

header('HTTP/1.1 404');

Quería saber si es absolutamente necesario especificar la descripción del código de estado como OK, Not Found, etc. Me gustaría evitar especificar ya que mi código de estado es una variable y necesitaría mantener una tabla de algunos sort mapeando cada código de estado individual a la descripción del código de estado. Encuentre el código que estoy usando a continuación.

$status = 404; //or any other response code
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol." $status");

Agradezco cualquier ayuda.

1
applecodervinegar 20 ene. 2021 a las 15:35

1 respuesta

La mejor respuesta

El mensaje se envía, incluso si no lo proporciona.

En el código fuente PHP, podemos ver cómo funciona.

En sapi/litespeed/lsapi_main.c , se almacena una lista de códigos / mensajes.

static const http_error http_error_codes[] = {
   {100, "Continue"},
   {101, "Switching Protocols"},
   {200, "OK"},
   // ...
   {403, "Forbidden"},
   {404, "Not Found"},
   // ...
   {0,   NULL}
};

Luego, en sapi_lsapi_send_headers_like_cgi(), de sapi_lsapi_send_headers(), el estado se convierte a entero y el mensaje se encuentra en la estructura http_error (muchas líneas se omiten a continuación):

if (SG(sapi_headers).http_response_code != 200)
{
    // ...
    if (SG(sapi_headers).http_status_line &&
         (s = strchr(SG(sapi_headers).http_status_line, ' ')) != 0 &&
         (s - SG(sapi_headers).http_status_line) >= 5 &&
         strncasecmp(SG(sapi_headers).http_status_line, "HTTP/", 5) == 0
    ) {
        len = slprintf(buf, sizeof(buf), "Status:%s", s);
        response_status = atoi((s + 1));
    }
    // ...
            http_error *err = (http_error*)http_error_codes;
            while (err->code != 0) {
                if (err->code == SG(sapi_headers).http_response_code) {
                    break;
                }
                err++;
            }
            if (err->msg) {
                len = slprintf(buf, sizeof(buf), "Status: %d %s", SG(sapi_headers).http_response_code, err->msg);
            } else {
                len = slprintf(buf, sizeof(buf), "Status: %d", SG(sapi_headers).http_response_code);
            }
        //...

Luego, la función LSAPI_SetRespStatus_r() contiene esta información y, finalmente, la función LSAPI_FinalizeRespHeaders_r() envía la información finalizada del encabezado.

La línea más interesante es ( almacenar el mensaje de http_error):

len = slprintf(buf, sizeof(buf), "Status: %d %s", SG(sapi_headers).http_response_code, err->msg);

Para obtener información, consulte también la estructura simple de http_error:

typedef struct _http_error {
  int code;
  const char* msg;
} http_error;
1
Syscall 20 ene. 2021 a las 19:05