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 — Desarrollador front-end y redactor de Tecnología en OneKitly
Rendimiento web · Formatos de archivo
Verificado con 2 fuentes
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.
| Código | Nombre | A qué compromete | Dónde falla |
|---|---|---|---|
| 200 | OK | La petición tuvo éxito y el cuerpo es el resultado | Devuelto con un mensaje de error dentro del cuerpo, lo que oculta el fallo a cachés, monitorización y rastreadores |
| 301 | Movido permanentemente | Esta URL queda sustituida para siempre; actualiza tus enlaces | Usado mientras aún se decide: los navegadores lo cachean con fuerza y los clientes antiguos convierten un POST redirigido en GET |
| 302 | Encontrado | Ve aquí por ahora; sigue usando la URL original | Usado para un traslado permanente, con lo que la URL antigua sigue absorbiendo las señales de posicionamiento |
| 304 | No modificado | Tu copia en caché sigue siendo válida; no hay cuerpo | Enviado fuera de una petición condicional, o con un cuerpo que los clientes pueden descartar |
| 307 | Redirección temporal | Como 302, pero el método y el cuerpo no deben cambiar | Poco usado, así que las redirecciones temporales rompen en silencio los flujos basados en POST |
| 308 | Redirección permanente | Como 301, pero el método y el cuerpo no deben cambiar | Se pasa por alto en endpoints de API, donde un 301 degrada en silencio un POST a GET |
| 401 | No autenticado | No se presentaron credenciales válidas; una cabecera WWW-Authenticate indica qué se espera | Devuelto a un usuario ya autenticado pero sin permiso: ese caso es 403 |
| 403 | Prohibido | La identidad se acepta y la acción se rechaza igualmente | Usado como cajón de sastre, lo que invita a los clientes a reintentar una autenticación que nunca ayudará |
| 404 | No encontrado | No hay nada en esta URL y el servidor no dice si es definitivo | Sustituido por una página amable servida con 200, el soft 404 que mantiene indexadas URL muertas |
| 410 | Desaparecido | Retirado a propósito y no volverá; cacheable por defecto | Casi nunca se usa, aun cuando la retirada fue intencionada y 404 se queda corto |
| 429 | Demasiadas peticiones | Se alcanzó un límite de tasa; Retry-After indica cuánto esperar antes de una nueva petición | Enviado sin Retry-After, dejando que los clientes adivinen y machaquen el endpoint |
| 500 | Error interno del servidor | El servidor falló y no tiene nada más específico que decir | Devuelto por una petición incorrecta del cliente, que corresponde al rango 400 |
| 502 | Puerta de enlace incorrecta | Un 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 |
| 503 | Servicio no disponible | Temporalmente incapaz de responder; Retry-After estima cuánto durará la caída | Sustituido por un 500 durante un mantenimiento planificado, así que los rastreadores toman la caída por un fallo real |
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 →Herramientas relacionadas
Fuentes
¿Has detectado un error en este artículo?