# Reglas de redirección

> Redirecciones en el borde por nombre y prefijo de ruta: cómo casan las reglas, cómo se construye el destino, en qué orden actúan y qué necesitan.

Una regla de redirección responde a las peticiones de un nombre de la zona cuya ruta empieza por un prefijo con una redirección (`301`, `302`, `307` o `308`) a una URL absoluta. La petición nunca llega a tu origen. Una zona puede tener hasta 50 reglas.

## Cómo casa una regla

- `host` es un nombre exacto de la zona (la propia zona o un nombre por debajo, sin comodines).
- `path_prefix` casa en un límite de segmento: `/` casa con todas las rutas; `/blog` casa con `/blog` y `/blog/x`, no con `/blogging`. La query no cuenta.
- Si casan varias reglas del mismo nombre, gana el **prefijo más largo**.

## Cómo se construye el destino

`Location` es el `target` y además:

- con `preserve_path` (activado por defecto): el resto de la ruta tras el prefijo;
- con `preserve_query` (activado por defecto): la query de la petición, añadida tras la del destino con `&`.

| Regla | Petición | `Location` |
|---|---|---|
| `/` → `https://example.com` | `/a/b?x=1` | `https://example.com/a/b?x=1` |
| `/blog` → `https://news.example.net/articles/` | `/blog/x` | `https://news.example.net/articles/x` |
| `/blog` → `https://news.example.net/articles/`, `preserve_path: false` | `/blog/x` | `https://news.example.net/articles/` |
| `/` → `https://example.com/?ref=old` | `/?utm=y` | `https://example.com/?ref=old&utm=y` |

Se rechaza una regla que redirigiría a su propio nombre en una ruta que ella misma captura (un bucle); por ejemplo, `www.example.com` `/` → `https://www.example.com/home`.

## Qué estado elegir

| Estado | Uso |
|---|---|
| `301` (por defecto) | Traslado permanente. Navegadores y buscadores lo recuerdan. |
| `302` | Temporal; úsalo mientras pruebas. |
| `307` | Temporal, conserva el método (`POST` sigue siendo `POST`). |
| `308` | Permanente, conserva el método. |

## Orden en el borde

- Los retos ACME HTTP-01 (`/.well-known/acme-challenge/`) se contestan antes y nunca se redirigen.
- Una petición `http://` se redirige primero a `https://` en el mismo nombre y después se aplica la regla.
- Las reglas se aplican después de la puerta de acceso, las reglas por IP y por país, las listas de amenazas, los límites de peticiones y la política del control de rastreadores IA, y antes del WAF y del origen. Consulta [Cómo se procesa una petición](https://developers.openwaf.dev/es/waf/request-processing/).

## www y la raíz

El borde ya redirige `www.<raíz>` a `<raíz>` (301, misma ruta y query) cuando la raíz es un sitio con proxy. Cede ante una regla explícita cuando el nombre `www` tiene una regla que casa con la ruta, o cuando la raíz tiene una regla cuyo destino es el nombre `www` (si no, harían bucle). Así que, para que `www` sea tu nombre canónico, añade una regla en la raíz: `example.com` `/` → `https://www.example.com`.

## Requisitos

- **Un registro DNS con proxy para el nombre.** Sin él, el DNS no apunta al borde y el borde no conoce el nombre. El cambio se aplica, pero devuelve un aviso por cada regla cuyo nombre no tiene registro con proxy.
- **Un certificado que cubra el nombre** para HTTPS. Los certificados automáticos cubren los nombres con proxy de la zona, así que basta con el registro con proxy; con certificados subidos a mano, sube uno que cubra el nombre. Consulta [Certificados del borde](https://developers.openwaf.dev/es/ssl/edge-certificates/).

## Gestionar las reglas

**Panel**

Dominio → **Reglas → Redirecciones**. **Añadir redirección** abre el editor con **Nombre**, **Prefijo de ruta**, **URL de destino**, **Estado**, **Conservar el resto de la ruta** y **Conservar la consulta**; enseña un ejemplo del resultado y la forma en que se guardará la regla. Edita o quita reglas desde la lista y guarda el cambio.
**CLI**

```sh
openwaf-cloud ctl zones show example.com
openwaf-cloud ctl zones set example.com redirects:='[
  {"host":"old.example.com","target":"https://example.com"},
  {"host":"example.com","path_prefix":"/blog","target":"https://news.example.net/articles/","status":302}
]' --reason "Trasladar el blog"
```
**API**

`PATCH /v1/orgs/{org}/zones/{zone}/edge` con `{"redirects": [...]}`. La lista se sustituye entera; `[]` quita todas las reglas.
**MCP**

`update_settings` con `settings.redirects` (la lista entera). Las redirecciones son de la zona: no pases `host` a `update_settings` para ellas.
