¿Odias los anuncios? Ir Sin publicidad Hoy

Modos de encriptación AES explicados: por qué GCM supera a CBC en la mayoría de los casos (y en qué casos no) 2

Publicado el

No es un diccionario. Es una guía enfocada sobre los códigos de estado HTTP que causan errores reales en producción — la redirección incorrecta que ahora está cachada para siempre, el malentendido entre 401/403 que revela tu lógica de autenticación, 429 sin Retry-After, y la confusión entre 503 y 5-04 que te lleva a depurar la capa equivocada.

Códigos de Estado HTTP que realmente te atrapan — 301 vs 302, 401 vs 405 y el campo de 5xx 1
ANUNCIO · ¿ELIMINAR?

Ha enviado un redirigido y fue del tipo incorrecto. Ahora cada navegador que lo recibió antes de usted lo ha almacenado permanentemente, y la única forma de solucionarlo es esperar el vencimiento del caché o pedir a los usuarios que eliminen su historial de navegación. Eso es un 301.

Esto no es un diccionario de códigos de estado — hay muchos de esos. Este es el guía que necesitas después de haber leído la tabla y aún así haber enviado el código incorrecto. Estamos revisando los que causan errores reales: cachés permanentes cuando se quería temporal, errores de autenticación que revelan información, respuestas de límite de velocidad que no se manejan correctamente, y timeouts de puente que apuntan a la capa equivocada.

301 vs 302 vs 307 vs 308: La Matriz de Redirecciones

El error que hace al menos una vez todo el mundo: usas 301 Moved Permanently mientras pruebas una reestructuración de URL. Funciona. Continúas. Luego reestructuras de nuevo. Y ahora un grupo de tus usuarios —cualquiera que visitó antes de la segunda modificación— son enviados a la antigua dirección de forma permanente, almacenada directamente en su navegador.

El 301 es permanente y se almacena de forma agresiva. Los navegadores establecen el tiempo de vida del redirigido almacenado en caché a casi infinito a menos que hayas establecido un Cache-Control encabezado. No hay forma programática de expirarlo desde el navegador del usuario. Si aún estás definiendo tu estructura de URL, usa 302.

El problema de la conservación del método es un caso diferente. Cuando un navegador sigue un 301 o 302, puede y en la práctica, casi siempre lo hace — reducir un POST a un GET en la redirección. Esto es técnicamente una violación del especificación original de HTTP/1.0, pero los navegadores la normalizaron hace mucho tiempo que el RFC 7231 la reconoce como comportamiento estándar. Si estás redirigiendo un POST —por ejemplo, después de una entrega de formulario— y esperas que el método se conserve, necesitas 307 o 308. Permanente?

CódigoConserva el método?Usa paraNo (POST → GET)
301Redirecciones permanentes donde el GET es adecuado tras la redirecciónRedirecciones temporales, banderas de características, pruebas A/B
302NoRedirecciones permanentes donde el GET es adecuado tras la redirecciónRedirecciones temporales donde se debe conservar el método
307NoRedirecciones permanentes donde se debe conservar el método
308El soporte de 308 es sólido ahora —Chrome, Firefox, Safari y Edge lo manejan correctamente. La advertencia: algunos clientes antiguos de API y bibliotecas HTTP aún no siguen correctamente el 308, por lo que si estás redirigiendo tráfico máquina a máquina y no controlas ni al cliente ni a su biblioteca HTTP, prueba explícitamente.

401 vs 403: Autenticación vs Autorización

401 significa “no has identificado tu cuenta”.

La especificación requiere que incluya un encabezado que indique al cliente cómo autenticarse. Es el código correcto cuando no hay sesión válida, no hay token o el token ha expirado. WWW-Authenticate 403 significa “sé quién eres y la respuesta es no”.

El usuario está autenticado pero carece de permisos. Devolver 403 en un token expirado es incorrecto — eso es un 401. Devolver 401 en una solicitud con permisos válidos pero insuficientes también es incorrecto, y peor aún, confunde tu depuración de autenticación: buscarás credenciales faltantes cuando el problema real es la asignación de roles. El argumento de seguridad para devolver

en lugar de 403 es real. Si tu API devuelve 403 en , has dicho claramente a cualquier atacante que el punto de acceso existe y que necesitaría privilegios más altos para acceder a él. Devolver 404 en su lugar no revela ninguna información sobre la existencia del recurso. Es una decisión: 403 es técnicamente correcto y más fácil de depurar; 404 es la opción segura para puntos de acceso sensibles donde la enumerabilidad importa. GET /admin/users429: El límite de velocidad es inútil sin Retry-After

Una respuesta 429 sin un

encabezado es una caja negra. El cliente sabe que ha sido limitado. No sabe si debe esperar 100ms o 24 horas. La mayoría de las implementaciones de clientes o intentan reintentar inmediatamente (atacando tu límite de velocidad) o abandonan por completo. Retry-After Toma ya sea un entero (segundos de espera) o una fecha HTTP (cuándo volver a intentar):

Retry-After los encabezados no están en ningún RFC — son una norma de facto proveniente de la API de GitHub que todos han copiado. Inclúyelos junto con

HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1749254400

El X-RateLimit-* . El trio de Limit/Remaining/Reset informa al cliente de su situación antes de que llegue al límite, lo cual es más útil que simplemente saber que ha llegado al límite. Retry-AfterUna cosa que vale la pena destacar:

es también válido en respuestas 503, y significa lo mismo — “vuelve en este número de segundos”. Si tu servicio está temporalmente inactivo por una ventana de mantenimiento, envía un 503 con Retry-After en lugar de simplemente dejar las conexiones. Retry-After 503 vs 504: Dónde está el fallo?

Estos dos parecen similares pero apuntan a capas completamente diferentes de fallo, y mezclarlos te lleva a depurar en la dirección equivocada.

503 Servicio no disponible

significa que el servidor al que llegaste no puede manejar la solicitud en este momento — está sobrecargado, en modo de mantenimiento o una dependencia de backend está inactiva. El servidor mismo respondió; simplemente lo rechaza. 504 Timeout del Gateway

significa que un proxy o gateway (tu balanceador de carga, nginx, gateway de API, CDN) intentó alcanzar un servidor upstream y no recibió respuesta en el tiempo establecido. El servidor al que llegaste está vivo. Lo que está detrás de él no responde. En la práctica: si estás detrás de nginx y tu servidor de aplicación (Node, Rails, Django, etc.) se cae, obtienes 502 Bad Gateway — nginx recibió una respuesta, pero era incorrecta. Si el servidor de aplicación deja de responder completamente, obtienes 504. Si retornas un error intencional desde la capa de aplicación, obtienes 503. La distinción importa al triage: 504 significa que debes investigar el servicio upstream, tu configuración de tiempo de espera y tu red. 503 significa que debes investigar la aplicación en sí.

422 vs 400: Los errores de validación tienen su propio código

400 Request malformado

se usa para solicitudes que el servidor no puede parsear — JSON malformado, sintaxis incorrecta en la cadena de consulta, cabeceras requeridas faltantes. Es un problema estructural. 422 Entity no procesable

se usa para solicitudes que el servidor entendió pero no puede actuar porque los datos fallan en la validación — un rango de fechas donde el inicio es después del final, un campo de correo electrónico con una dirección inválida, un campo de cantidad que es negativo. La solicitud era sintácticamente correcta. Los aspectos semánticos eran incorrectos. La mayoría de las APIs combinan ambos en 400 y ocultan los detalles de validación en el cuerpo de la respuesta. Funciona, pero hace más difícil el manejo de errores en el cliente: los clientes deben analizar el cuerpo para saber si es un error de parseo o un error de validación. Usar 422 para errores de validación permite a los clientes basarse en el código de estado. Rails lo ha hecho correctamente desde siempre; el esquema JSON:API especifica 422 para errores de validación también.

Una nuance: 422 está definido en WebDAV (RFC 4918), no en la especificación principal de HTTP. En la práctica esto no importa — todos los clientes y servidores de HTTP lo manejan bien — pero ocasionalmente encontrarás un pedante que insiste en usar 400 en su lugar. No están completamente equivocados. Pero 422 es más específico y ampliamente comprendido.

204 vs 200 con cuerpo vacío: uno es correcto para DELETE

Cuando un DELETE es exitoso, la respuesta correcta es

204 No Content — no 200 con cuerpo vacío, ni 200 con 204 es la señal explícita de que “el éxito se produjo y no hay cuerpo de respuesta intencionalmente”. Un 200 con cuerpo vacío es técnicamente válido, pero es ambiguo — los clientes no saben si el cuerpo estaba planeado y se perdió, o si la ausencia es intencional. 204 elimina esa ambigüedad. {"success": true}.

La misma lógica se aplica a PUT y PATCH cuando no se devuelve el recurso actualizado. Si tu API devuelve el objeto actualizado tras un PATCH, usa 200. Si no, usa 204. No devuelvas 200 con un cuerpo vacío de

— eso es 204 vestido de traje. {} o null Una advertencia: 204 no debe incluir un cuerpo de mensaje

de acuerdo con el RFC 9110. Si devuelves 204 y accidentalmente incluyes un cuerpo (algunas frameworks te permiten), algunos clientes HTTP lo manejarán de forma gráfica, otros no. Elimina el cuerpo en tu manejador de respuesta, no solo en tu intención. Referencia rápida: Los códigos que realmente te pican y por qué Error común

Solución

CódigoSignificadoRedirección permanenteUsar durante pruebas — ahora está almacenada para siempre
301Usa 302 hasta que la redirección se confirme permanenteRedirección temporalUn POST se reduce a GET al seguirse
302Usa 307 si se debe conservar el métodoRedirección temporal (segura para el método)Confundida con 302
307Usa cuando se redirige un POST/PUT/PATCH temporalmenteRedirección permanente (segura para el método)Omitida en favor de 301 por hábito
308Usa en lugar de 301 cuando el método importaError de solicitud (error de parseo)Usado para errores de validación también
400Usa 422 para fallos de validación semánticosNo autenticadoDevuelto cuando el usuario carece de permisos (debería ser 403)
401Devuelve 401 solo cuando faltan credenciales o han expiradoDevuelto en lugar de 404 para puntos de acceso sensiblesConsidera 404 cuando ocultar la existencia del punto de acceso importa
403ProhibidoEntidad no procesableCombinada en 400
422Usa para fallos de validación donde el cuerpo era parseableLímite de velocidad alcanzadoFalta el encabezado Retry-After
429Incluye siempre Retry-After + X-RateLimit-* encabezadosServicio no disponibleConfundido con 504
503Usa cuando el servidor alcanzado no puede manejar la solicitudTimeout del gatewayConfundido con 503
504Investiga el servicio upstream, no el gatewaySin contenidoDevuelve 200 con cuerpo vacío en su lugar
204Usa 204 para DELETE/PUT/PATCH exitosos sin cuerpo de respuestaSi necesitas buscar rápidamente cualquier código de estado mientras se depura,IO Tools tiene una búsqueda de códigos de estado HTTP

que cubre el rango completo con descripciones y notas sobre cuándo usar cada uno. El patrón detrás de todos estos casos La mayoría de estos errores provienen del mismo lugar: tratar los códigos de estado como categorías sueltas (“4xx es error del cliente, 5xx es error del servidor, listo”) en lugar de como un protocolo con semánticas específicas. Las semánticas importan porque los clientes — navegadores, bibliotecas HTTP, CDNs, herramientas de monitoreo — realmente se basan en ellos. Un CDN no almacenará un 200 y un 204 de la misma manera. Un cliente HTTP no reintentará un 400 y un 503 con la misma lógica. Un navegador no almacenará un 302 y un 301 con el mismo TTL.

Usa el código correcto. La sobrecarga es cero. El beneficio de depuración cuando algo falla no lo es.

Códigos de estado HTTP que realmente te pican — 301 vs 302, 401 vs 403 y el campo de 5xx 2

Códigos de estado HTTP que realmente te pican — 301 vs 302, 401 vs 403 y el campo de 5xx 1

También te puede interesar

¿Quieres eliminar publicidad? Adiós publicidad hoy

Instalar extensiones

Agregue herramientas IO a su navegador favorito para obtener acceso instantáneo y búsquedas más rápidas

añadir Extensión de Chrome añadir Extensión de borde añadir Extensión de Firefox añadir Extensión de Opera

¡El marcador ha llegado!

Marcador es una forma divertida de llevar un registro de tus juegos, todos los datos se almacenan en tu navegador. ¡Próximamente habrá más funciones!

ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?

Noticias Aspectos técnicos clave

Involucrarse

Ayúdanos a seguir brindando valiosas herramientas gratuitas

Invítame a un café
ANUNCIO · ¿ELIMINAR?