Ir al contenido
OneKitly

Códigos de estado HTTP explicados: los que de verdad se confunden

Publicado el 29/4/2026 · 9 min de lectura · Herramientas para desarrolladores

Daniel Okonkwo

Daniel OkonkwoDesarrollador front-end y redactor de Tecnología en OneKitly

Rendimiento web · Formatos de archivo

Verificado con 2 fuentes

Ver perfil
En resumen

El primer dígito es la parte que leen todos los clientes, cachés y rastreadores: 1xx informativo, 2xx éxito, 3xx redirección, 4xx la petición tuvo la culpa, 5xx la tuvo el servidor. Dentro de eso, las distinciones que cambian el comportamiento son estas. 308 es un 301 con la garantía de que el método y el cuerpo sobreviven a la redirección, y 307 es un 302 con la misma garantía: los clientes antiguos convierten un POST redirigido en GET con 301 y 302, que es justo la razón de ser de 307 y 308. 401 significa que la petición no llevaba credenciales válidas y debe venir con una cabecera WWW-Authenticate; 403 significa que las credenciales estaban bien y aun así la acción se rechaza, así que volver a iniciar sesión no ayuda. 404 dice que aquí no hay nada sin comprometerse con el motivo; 410 dice que el recurso se retiró a propósito y no volverá, y es cacheable por defecto. En 429 y 503, Retry-After es una estimación que publica el servidor en segundos o como fecha HTTP: una guía para clientes educados, no la promesa de volver a tiempo.

301 frente a 308, 302 frente a 307, 401 frente a 403, 404 frente a 410 — y qué promete de verdad Retry-After en un 429 o un 503. Los pares donde elegir mal el código cambia el comportamiento, no solo la redacción.

El primer dígito es la única parte que algunos clientes leen

La RFC 9110 exige que un cliente entienda la clase de un código de estado aunque no reconozca el código en sí, y que trate cualquier código desconocido como el x00 de su clase. Un cliente que nunca ha oído hablar del 451 lo maneja como un 400; un 599 desconocido se maneja como un 500. Esa regla es lo que hace extensible el espacio, y también significa que la clase carga con casi todo el comportamiento: las cachés deciden a partir de ella si almacenan, los proxies si reintentan y los rastreadores si indexan, casi siempre antes de analizar nada de tu cuerpo de respuesta.

La consecuencia práctica es que devolver un 200 con el error descrito en el cuerpo coloca el fallo donde nada más puede verlo. Tu sonda de disponibilidad marca verde, tu CDN cachea la página de error y un buscador la indexa como un documento real. Es el problema del soft 404 en su forma general, y merece una auditoría, porque el arreglo es un cambio de una línea en el código de estado y no algo arquitectónico.

Redirecciones: cuáles conservan tu POST

La rejilla de cuatro códigos de redirección cruza en realidad dos preguntas: permanente o temporal, y si el método sobrevive. 301 y 308 son permanentes, 302 y 307 temporales; 307 y 308 son los dos que prohíben al cliente cambiar la petición. MDN es directo sobre por qué existe el par nuevo: el 301 ya exigía que el método y el cuerpo quedaran intactos, pero esa exigencia la manejaban mal los clientes antiguos, que pasaban a GET. Nadie podía arreglar el parque instalado, así que se acuñaron dos códigos nuevos con la garantía escrita en su definición.

Así que la elección se sigue del tráfico. Para una página que solo recibe GET, el 301 está bien y es a lo que más acostumbrados están los buscadores. Para una ruta de API, el destino de un formulario o cualquier cosa que pueda recibir POST, PUT o DELETE, usa 308 y la petición llega intacta. Una advertencia sobre la permanencia: los navegadores cachean un 301 con agresividad y algunos lo guardan mucho más de lo que esperas, así que un 301 emitido durante un experimento puede sobrevivirlo en máquinas a las que no tienes acceso. Sirve 302 o 307 mientras aún decides.

Los errores que más a menudo se devuelven mal

401 y 403 son el par que más tiempo de soporte cuesta. El 401 significa que la petición carecía de credenciales de autenticación válidas, y MDN señala que se envía con una cabecera WWW-Authenticate que describe el esquema que el servidor espera: es una invitación a reintentar con credenciales. El 403 es la situación contraria: las credenciales son perfectamente válidas y el cliente sigue sin permiso para esta acción. Devolver un 401 a un usuario autenticado le dice a su cliente que vuelva a autenticarse, lo que producirá exactamente el mismo rechazo, y le hace creer que su sesión está rota cuando no lo está.

404 y 410 solo se diferencian en el grado de certeza, y ahí está la clave. La guía de MDN es explícita: si quien opera el servidor no sabe si la situación es temporal o permanente, debe usar 404. El 410 se usa cuando retiraste la cosa a propósito y no volverá: es cacheable por defecto y dice a los rastreadores que dejen de preguntar. Retry-After, por su parte, es una cabecera que lleva un retardo en segundos o una fecha HTTP; en un 503 estima cuánto estará el servicio no disponible y en un 429 indica cuánto esperar antes de una nueva petición. Es una guía, no un contrato, y MDN señala que el soporte entre clientes es desigual, pero Googlebot la respeta, lo que ya justifica ponerla durante un mantenimiento planificado.

Los códigos que conviene acertar y a qué compromete cada uno
CódigoNombreA qué comprometeDónde falla
200OKLa petición tuvo éxito y el cuerpo es el resultadoDevuelto con un mensaje de error dentro del cuerpo, lo que oculta el fallo a cachés, monitorización y rastreadores
301Movido permanentementeEsta URL queda sustituida para siempre; actualiza tus enlacesUsado mientras aún se decide: los navegadores lo cachean con fuerza y los clientes antiguos convierten un POST redirigido en GET
302EncontradoVe aquí por ahora; sigue usando la URL originalUsado para un traslado permanente, con lo que la URL antigua sigue absorbiendo las señales de posicionamiento
304No modificadoTu copia en caché sigue siendo válida; no hay cuerpoEnviado fuera de una petición condicional, o con un cuerpo que los clientes pueden descartar
307Redirección temporalComo 302, pero el método y el cuerpo no deben cambiarPoco usado, así que las redirecciones temporales rompen en silencio los flujos basados en POST
308Redirección permanenteComo 301, pero el método y el cuerpo no deben cambiarSe pasa por alto en endpoints de API, donde un 301 degrada en silencio un POST a GET
401No autenticadoNo se presentaron credenciales válidas; una cabecera WWW-Authenticate indica qué se esperaDevuelto a un usuario ya autenticado pero sin permiso: ese caso es 403
403ProhibidoLa identidad se acepta y la acción se rechaza igualmenteUsado como cajón de sastre, lo que invita a los clientes a reintentar una autenticación que nunca ayudará
404No encontradoNo hay nada en esta URL y el servidor no dice si es definitivoSustituido por una página amable servida con 200, el soft 404 que mantiene indexadas URL muertas
410DesaparecidoRetirado a propósito y no volverá; cacheable por defectoCasi nunca se usa, aun cuando la retirada fue intencionada y 404 se queda corto
429Demasiadas peticionesSe alcanzó un límite de tasa; Retry-After indica cuánto esperar antes de una nueva peticiónEnviado sin Retry-After, dejando que los clientes adivinen y machaquen el endpoint
500Error interno del servidorEl servidor falló y no tiene nada más específico que decirDevuelto por una petición incorrecta del cliente, que corresponde al rango 400
502Puerta de enlace incorrectaUn proxy recibió una respuesta inválida del servidor al que reenvióSe depura en la aplicación cuando el fallo está entre el proxy y el servicio de origen
503Servicio no disponibleTemporalmente incapaz de responder; Retry-After estima cuánto durará la caídaSustituido por un 500 durante un mantenimiento planificado, así que los rastreadores toman la caída por un fallo real
Referencia de códigos de estado HTTPBusca y explora todos los códigos de estado HTTP estándar por clase, con su nombre y una descripción de una línea.Probar la herramienta

Preguntas frecuentes

¿Una migración de sitio debe usar 301 o 308?
Para páginas que solo se piden con GET, el 301 es el valor seguro y el que todo rastreador y proxy lleva décadas manejando. Recurre al 308 en todo lo que pueda recibir POST, PUT o DELETE — endpoints de formulario, rutas de API, receptores de webhooks — porque ahí es donde un cliente que degrada el método en silencio convierte una redirección en un cuerpo de petición perdido. Nada impide usar ambos en la misma migración, ruta por ruta.
¿Qué debe devolver una API cuando falla la validación?
Usa 400 Bad Request cuando la petición en sí está malformada y el servidor no puede analizarla: JSON roto, una cabecera obligatoria ausente. Usa 422 Unprocessable Content cuando la sintaxis es correcta pero el contenido incumple tus reglas, como un cuerpo bien formado con una fecha de fin anterior a la de inicio. Lo que no debes devolver es un 500, que culpa al servidor de un error del cliente y contamina tu presupuesto de errores, ni un 200 con el problema descrito en el cuerpo, que oculta el fallo a todas las capas entre tú y quien llama.
¿Los 404 perjudican el posicionamiento?
Un 404 es una respuesta válida y honesta, y una parte normal de cualquier sitio con algo de historia; una página que ya no existe debe decirlo. El daño viene de los sustitutos. Un soft 404 — una página amable servida con estado 200 — mantiene URL muertas en el índice y gasta presupuesto de rastreo en nada. Redirigir en bloque toda página ausente a la portada es el mismo error disfrazado de 301. Si la retirada fue deliberada y permanente, el 410 lo dice sin rodeos.

Artículos que podrían interesarte

Todas las guías
TutorialCómo escribir una expresión cron: cinco campos y la regla OR que nadie mencionaMinuto, hora, día del mes, mes, día de la semana. Las trampas: un paso es un avance dentro de un rango y no un intervalo, y los dos campos de día se combinan con OR — así que 0 0 1 * 1 se dispara el día 1 y todos los lunes.TutorialCómo escribir un robots.txt: directivas, coincidencia y lo que no puede ocultarCuatro directivas, dos comodines, un archivo en la raíz del host. Es una instrucción de rastreo y nada más: no retira una página de los resultados, no restringe el acceso y publica cada ruta que enumeras en él.ExplicaciónCómo funcionan los permisos de archivo en Unix: leer 755 sin adivinarLectura 4, escritura 2, ejecución 1, y cada uno de los tres dígitos describe a una parte distinta. Lo que casi todas las explicaciones fallan es qué hace el bit de ejecución en un directorio: concede el paso, no el derecho a ejecutar nada.ComparativacamelCase, snake_case, kebab-case: cuál usar, y por qué rara vez eliges túLas convenciones no son cuestión de gusto. El guion es el operador menos, así que kebab-case no puede ser un identificador en la mayoría de lenguajes, y por eso justamente lo usan CSS y las URL. Además, el viaje de ida y vuelta con siglas que corrompe nombres en silencio, y la regla que lo arregla.ExplicaciónPunto y coma, tabulación, barra: elegir un delimitador que sobreviva al viajePor qué el idioma de quien lee decide el delimitador, qué hace el conversor con el entrecomillado al cambiar, qué es realmente la primera línea sep=, y el recuento de celdas entrecomilladas en la misma exportación escrita de cinco maneras.TutorialBases de regex: guía para principiantesUna expresión regular es un patrón para buscar texto. Aquí tienes los bloques — clases de caracteres, cuantificadores y anclas — con un ejemplo.

Herramientas relacionadas

Fuentes

¿Has detectado un error en este artículo?