# Respuestas y cabeceras del borde

> Códigos de estado que el borde de OpenWAF responde por su cuenta, los cuerpos que envía, las cabeceras que añade o quita y las que recibe tu origen.

## Códigos de estado

| Estado | Cuándo | Cuerpo |
|---|---|---|
| `301` | HTTP sin cifrar, o `www.<raíz>` cuando la raíz es un sitio con proxy. | Redirección a HTTPS o a la raíz. |
| `301`, `302`, `307`, `308` | Casó una [regla de redirección](https://developers.openwaf.dev/es/rules/redirects/). | Redirección. |
| `400` | `Transfer-Encoding` ambiguo o `Content-Length` contradictorio. | Texto plano. |
| `401` | Página de acceso de la [puerta de acceso](https://developers.openwaf.dev/es/waf/access-gate/). | Formulario HTML. |
| `403` | Regla por IP, regla por país, lista de amenazas, WAF, escudos de SSRF, redirección abierta o inyección de prompts; bloqueo del control de rastreadores IA (por defecto). | [Página de bloqueo](https://developers.openwaf.dev/es/waf/block-page/). |
| `403` | Reto o laberinto del control de rastreadores IA a una petición que no es una navegación. | `{"error":"verificacion de navegador requerida"}` o `{"error":"forbidden"}`. |
| `404` | Escudos de WordPress, *source maps* o GraphQL. | Texto plano `404 page not found`. |
| `413` | Cuerpo mayor que `max_body_mb`, o mayor que el límite de inspección de los escudos. | Texto plano. |
| `421` | El borde no sirve ese nombre. | Página genérica. |
| `429` | [Regla de límite de peticiones](https://developers.openwaf.dev/es/waf/rate-limiting/#per-path-rules) con `block` (o `challenge` en lo que no es navegación). | Página de bloqueo para navegadores, `{"error":"rate_limited","retry_after":N}` para el resto, con `Retry-After`. |
| `429` | Regla de límite por ruta, límite básico o escudo de paginación. | Página de bloqueo. |
| `503` | [Reto de navegador](https://developers.openwaf.dev/es/waf/browser-challenge/). | Página de prueba de trabajo, `Cache-Control: no-store`. |
| `502`, `525`, `526` | No se pudo llegar al origen o falló su TLS. | Consulta la [solución de problemas de SSL/TLS](https://developers.openwaf.dev/es/ssl/troubleshooting/). |

Los bloqueos del control de rastreadores IA usan la `block_response` que configures (401, 402, 403, 404, 410, 429, 451 o 503); consulta los [ajustes del control de rastreadores IA](https://developers.openwaf.dev/es/ai-crawl-control/settings/#block-response).

## Cabeceras de respuesta

En cada respuesta de tu origen, el borde:

- pone `Server` a `nginx` o a tu `fake_server_header`;
- quita `X-Powered-By`, `X-AspNet-Version`, `X-AspNetMvc-Version`, `X-Runtime`, `X-Generator`, `X-Debug-Info`, `X-Platform-Server`, `X-Served-By`, `X-Backend-Server`, `X-Drupal-Cache` y `X-Varnish`;
- añade, solo si el origen no las puso: `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy: strict-origin-when-cross-origin` y `Permissions-Policy: camera=(), microphone=(), geolocation=()`;
- pone `Strict-Transport-Security` en las respuestas HTTPS cuando HSTS está activado (consulta [HSTS](https://developers.openwaf.dev/es/ssl/hsts/));
- añade `Secure`, `HttpOnly` y `SameSite=Lax` a cada `Set-Cookie` que no los lleve.

> **Atención: Cookies que lee JavaScript**
>
> Como el borde añade `HttpOnly` a las cookies que no lo llevan, los scripts ya no pueden leerlas con `document.cookie`. Pon en el origen los atributos que necesites; el borde solo añade los que faltan.


En `/health`, `/status`, `/version`, `/api/health` y `/api/status`, el borde quita del cuerpo JSON los campos `version`, `build`, `commit`, `node_version`, `framework` y `nestjs`, para que no se pueda identificar la tecnología.

## CORS

Si tu origen refleja el `Origin` de la petición en `Access-Control-Allow-Origin`, el borde lo conserva solo si ese origen es el mismo sitio (el propio nombre, un subdominio o un dominio padre) o un host de [`cors_allow_origins`](https://developers.openwaf.dev/es/waf/settings/#cors-allow-origins). Si no, quita `Access-Control-Allow-Origin` y `Access-Control-Allow-Credentials`. Un comodín `*` junto con `Access-Control-Allow-Credentials: true` pierde la cabecera de credenciales.

## Cabeceras que recibe tu origen

| Cabecera | Valor |
|---|---|
| `X-Forwarded-For`, `X-Real-IP`, `CF-Connecting-IP` | La IP del cliente tal como la ve el borde (sustituye cualquier valor que enviara el cliente). |
| `X-Forwarded-Host` | El host pedido. |
| `X-Forwarded-Proto` | `https` o `http`. |

El borde quita de las peticiones `X-Originating-IP`, `X-Remote-IP`, `X-Remote-Addr`, `X-Client-IP`, `True-Client-IP` y `Forwarded`, para que un cliente no pueda falsear su dirección ante tu aplicación.
