# Rules Engine para Applications

Rules Engine para Applications guarda a lógica condicional de uma [aplicação](/pt-br/documentacao/plataforma/applications/). Cada regra testa uma requisição contra os seus critérios, o *se* da regra, e executa os seus behaviors, o *então*, somente quando a requisição corresponde. Toda regra pertence a uma fase: ela age sobre a requisição que o usuário envia ou sobre a resposta que o usuário recebe. Algumas variáveis e alguns behaviors exigem um Produto habilitado na aplicação, e cada tabela desta página indica qual. Para a ordem em que uma aplicação executa as suas regras e os seus behaviors, consulte [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona/).

Uma regra de aplicação decide como a aplicação trata uma requisição que chegou a ela, como o connector ou o cache setting que a requisição usa. Quando o deployment do workload nomeia um firewall, o firewall decide antes se a requisição chega ou não à aplicação. Para as regras dele, consulte [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/).

---

## Campos da regra

Uma aplicação guarda as suas regras na aba **Rules Engine** do Azion Console, onde **+ Rule** cria uma regra. Uma aplicação nova não tem regras. Na API, uma regra é um objeto JSON: uma requisição define cinco dos seus campos, e a plataforma define e retorna os outros cinco.

| Campo           | Tipo                                                              | Obrigatório     | Descrição                                                                                                                                                                                                               |
| --------------- | ----------------------------------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`            | integer                                                           | Somente leitura | O identificador que toda chamada posterior sobre a regra usa                                                                                                                                                            |
| `name`          | string, de 1 a 250 caracteres                                     | Sim             | O nome que a lista de regras mostra. Azion Console o exibe como **Name**, na seção **General**. Dê a cada regra um nome único                                                                                           |
| `description`   | string, até 1.000 caracteres                                      | Não             | Um comentário mostrado na lista de regras, exibido como **Description** em **General**. O padrão é uma string vazia. Com mais de 1.000 caracteres, Azion Console mostra `Description should not exceed 1000 characters` |
| `active`        | boolean                                                           | Não             | Se a regra é executada. O padrão é `true`. Azion Console o exibe como o switch **Active**, na seção **Status**                                                                                                          |
| `criteria`      | array de 1 a 5 grupos, cada um sendo um array de 1 a 10 critérios | Sim             | As condições que uma requisição precisa atender. Critérios lista todas as variáveis e todos os operadores                                                                                                               |
| `behaviors`     | array de 1 a 10 objetos de behavior                               | Sim             | O que a regra faz quando a requisição corresponde. Behaviors lista cada um deles                                                                                                                                        |
| `order`         | integer, de 0 a 199                                               | Somente leitura | A posição da regra na lista da sua fase                                                                                                                                                                                 |
| `last_editor`   | string                                                            | Somente leitura | A conta que alterou a regra pela última vez                                                                                                                                                                             |
| `last_modified` | date-time                                                         | Somente leitura | Quando a regra foi alterada pela última vez                                                                                                                                                                             |
| `created_at`    | date-time                                                         | Somente leitura | Quando a regra foi criada                                                                                                                                                                                               |

A plataforma atribui `order` à medida que as regras são criadas: a primeira regra de uma fase carrega `0`, e a regra seguinte carrega `1`. A lista de regras do Azion Console permite mover uma regra, e uma posição além do fim da lista coloca a regra em último lugar. A API reordena uma fase com uma única chamada, que a seção API lista.

---

## Fases

Uma regra é executada na fase escolhida na seção **Phase** quando a regra é criada, e essa escolha é definitiva. Para executar a mesma lógica na outra fase, crie uma regra nova nessa fase. Azion Console agrupa a lista de regras por fase, e a API mantém cada fase em uma coleção própria.

| Fase           | Sobre o que as suas regras agem               | Coleção na API                                               |
| -------------- | --------------------------------------------- | ------------------------------------------------------------ |
| Request Phase  | A requisição que o usuário envia à aplicação  | `/v4/workspace/applications/<application-id>/request_rules`  |
| Response Phase | A resposta que a aplicação entrega ao usuário | `/v4/workspace/applications/<application-id>/response_rules` |

Cada fase oferece o seu próprio conjunto de variáveis e behaviors. Um valor que só existe depois que a origem responde, como `${status}`, só pode ser lido na Response Phase. A coluna Fases da tabela de variáveis e as duas colunas de API da tabela de behaviors indicam qual fase aceita cada um.

---

## Critérios

Os critérios decidem sobre quais requisições uma regra age. Um critério nomeia uma variável, um operador e, para a maioria dos operadores, um argumento com o qual a variável é comparada. Na API, um critério é um objeto com quatro chaves: `variable`, `operator`, `conditional` e `argument`.

Este critério corresponde a uma requisição de um navegador desktop, com uma expressão regular sobre o header `User-Agent`:

```json
[[{ "variable": "${http_user_agent}", "conditional": "if", "operator": "matches", "argument": "(Chrome|Mozilla)" }]]
```

### Variáveis

Uma variável contém um valor da requisição ou da resposta, e a coluna Fases indica onde um critério pode lê-la. `${request_uri}` e `${device_group}` exigem [Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/) na aplicação. A API recusa uma regra com `${request_uri}` em uma aplicação sem esse Produto, com `400` e o código `25047`. `${uri}` não exige nenhum Produto, então é a variável de URI para uma aplicação sem Application Accelerator.

Seis entradas são famílias: substitua `name` pelo argumento, pelo cookie ou pelo header a ser lido.

| Variável                       | O que contém                                                                                                                                                                                                                                                                                                 | Exemplo                                                                                                                                | Fases             |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| `${arg_name}`                  | O valor do argumento de query string `name`                                                                                                                                                                                                                                                                  | `${arg_search}` contém `test` para `/path?search=test`                                                                                 | Request, Response |
| `${args}`                      | Todos os nomes e valores de argumentos da query string                                                                                                                                                                                                                                                       | `${args}` contém `search=test` para `/path?search=test`                                                                                | Request, Response |
| `${cookie_name}`               | O valor do cookie `name`                                                                                                                                                                                                                                                                                     | `${cookie_icl_current_language}` contém `pt-br` para `icl_current_language = pt-br`                                                    | Request, Response |
| `${device_group}`              | O nome do [device group](/pt-br/documentacao/plataforma/applications/device-groups/) ao qual a requisição corresponde, da aba **Device Groups** da aplicação. Exige Application Accelerator                                                                                                                  | `Mobile`                                                                                                                               | Request, Response |
| `${domain}`                    | O host name ou o header `Host` da requisição, como `${host}` o lê, sem o último subdomínio depois do domínio de segundo nível                                                                                                                                                                                | `blog.domain.com` para `az.blog.domain.com`                                                                                            | Request, Response |
| `${geoip_city}`                | O nome da cidade, da base de geolocalização `geoip_city`                                                                                                                                                                                                                                                     | `Sao Paulo`                                                                                                                            | Request, Response |
| `${geoip_city_continent_code}` | O código de duas letras do continente, da base de geolocalização `geoip_city`                                                                                                                                                                                                                                | `EU`, para Europa                                                                                                                      | Request, Response |
| `${geoip_city_country_code}`   | O código de duas letras do país, da base de geolocalização `geoip_city`                                                                                                                                                                                                                                      | `IN`, para Índia                                                                                                                       | Request, Response |
| `${geoip_city_country_name}`   | O nome do país, da base de geolocalização `geoip_city`                                                                                                                                                                                                                                                       | `United States`                                                                                                                        | Request, Response |
| `${geoip_continent_code}`      | O código de duas letras do continente                                                                                                                                                                                                                                                                        | `NA`, para América do Norte                                                                                                            | Request, Response |
| `${geoip_country_code}`        | O código de duas letras do país, da base de geolocalização `geoip_country`                                                                                                                                                                                                                                   | `RU`, para Rússia                                                                                                                      | Request, Response |
| `${geoip_country_name}`        | O nome do país, da base de geolocalização `geoip_country`                                                                                                                                                                                                                                                    | `France`                                                                                                                               | Request, Response |
| `${geoip_region}`              | O código de duas letras da região                                                                                                                                                                                                                                                                            | `FL`, para Flórida                                                                                                                     | Request, Response |
| `${geoip_region_name}`         | O nome da região, da base de geolocalização `geoip_region`                                                                                                                                                                                                                                                   | `Ontario`                                                                                                                              | Request, Response |
| `${host}`                      | Em ordem de precedência: o host name na linha da requisição, o valor do header `Host` ou o nome do servidor que atende a requisição                                                                                                                                                                          | `blog.domain.com`                                                                                                                      | Request, Response |
| `${http_name}`                 | O valor do header de requisição `name`, escrito em letras minúsculas, com cada hífen substituído por um underscore. `name` precisa ser um [header de requisição HTTP](https://developer.mozilla.org/en-US/docs/Glossary/Request_header) válido                                                               | `${http_accept}` contém `image/webp,image/apng` para `Accept: image/webp,image/apng`                                                   | Request, Response |
| `${remote_addr}`               | O endereço IP do cliente que envia a requisição                                                                                                                                                                                                                                                              | `200.10.2.50`                                                                                                                          | Request, Response |
| `${remote_port}`               | A porta que o cliente usa na URL da sua requisição                                                                                                                                                                                                                                                           | `443`                                                                                                                                  | Request, Response |
| `${remote_user}`               | O nome de usuário enviado por autenticação básica, quando a requisição carrega um                                                                                                                                                                                                                            | `username`                                                                                                                             | Request, Response |
| `${request}`                   | A primeira linha original da requisição: o método, a URI e a versão HTTP                                                                                                                                                                                                                                     | `GET /path HTTP/2.0`                                                                                                                   | Request, Response |
| `${request_body}`              | O corpo da requisição                                                                                                                                                                                                                                                                                        | `{"name": "azion", "action": "login"}`                                                                                                 | Request, Response |
| `${request_method}`            | O método HTTP da requisição                                                                                                                                                                                                                                                                                  | `GET`                                                                                                                                  | Request, Response |
| `${request_uri}`               | A URI completa da requisição, com a query string, e com os caracteres UTF-8 especiais codificados para URL. Exige Application Accelerator                                                                                                                                                                    | `/path?var=value%20of%20var`                                                                                                           | Request, Response |
| `${scheme}`                    | O esquema da requisição                                                                                                                                                                                                                                                                                      | `https`                                                                                                                                | Request, Response |
| `${sent_http_name}`            | O valor do header de resposta `name`, escrito em letras minúsculas, com cada hífen substituído por um underscore                                                                                                                                                                                             | `${sent_http_content_length}` contém `9593` para `Content-Length: 9593`                                                                | Response          |
| `${server_addr}`               | O endereço IP do servidor que recebe a requisição                                                                                                                                                                                                                                                            | `200.0.0.0`                                                                                                                            | Request           |
| `${server_port}`               | A porta do servidor que recebe a requisição                                                                                                                                                                                                                                                                  | `8080`                                                                                                                                 | Request           |
| `${status}`                    | O status code da resposta                                                                                                                                                                                                                                                                                    | `200`                                                                                                                                  | Response          |
| `${tcpinfo_rtt}`               | O round-trip time (RTT) da conexão TCP do cliente, em microssegundos                                                                                                                                                                                                                                         | `24763`                                                                                                                                | Response          |
| `${upstream_addr}`             | O endereço IP e a porta da origem que respondeu. Várias origens são separadas por vírgulas. Depois de um redirecionamento interno de um grupo de servidores para outro, iniciado por um `X-Accel-Redirect` ou por uma página de erro, os grupos são separados por dois pontos                                | `192.168.1.1:80, 192.168.1.2:80`, ou `192.168.1.1:80, 192.168.1.2:80 : 192.168.10.1:80, 192.168.10.2:80` depois de um redirecionamento | Response          |
| `${upstream_cookie_name}`      | O valor do cookie `name` que a origem envia em `Set-Cookie`. Quando várias origens respondem a uma requisição, somente os cookies da última são mantidos                                                                                                                                                     | `${upstream_cookie_uuid}` contém `12345` para `Set-Cookie: uuid = 12345`                                                               | Response          |
| `${upstream_http_name}`        | O valor do header `name` que a origem envia, escrito em letras minúsculas, com cada hífen substituído por um underscore. Quando várias origens respondem a uma requisição, somente os headers da última são mantidos                                                                                         | `${upstream_http_server}` contém `UploadServer` para `Server: UploadServer`                                                            | Response          |
| `${upstream_status}`           | O status code que a origem retorna. Várias origens são separadas por vírgulas, e os grupos de um redirecionamento interno, por dois pontos, como em `${upstream_addr}`                                                                                                                                       | `200, 201`, ou `500, 502 : 200, 200` depois de um redirecionamento                                                                     | Response          |
| `${uri}`                       | A URI normalizada da requisição, com a codificação de URL decodificada. O valor pode mudar enquanto a requisição é processada, por exemplo depois de um redirecionamento interno ou quando um arquivo de índice responde. Para a query string ou para caracteres codificados para URL, leia `${request_uri}` | `/path/my file.txt`                                                                                                                    | Request, Response |

### Variáveis de Mutual Transport Layer Security (mTLS)

Estas variáveis contêm o certificado de cliente que uma requisição apresenta por mTLS, em que o cliente também se autentica com um certificado. Um critério as lê somente na Request Phase. Para saber como um workload pede e valida certificados de cliente, consulte [mTLS](/pt-br/documentacao/plataforma/workloads/mtls/).

| Variável                     | O que contém                                                                                                                  | Exemplo                                                                   |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| `${ssl_client_cert}`         | O certificado de cliente no formato Privacy-Enhanced Mail (PEM). Descontinuada: leia `${ssl_client_escaped_cert}` em vez dela | `-----BEGIN CERTIFICATE-----` `MIICnz...` `-----END CERTIFICATE-----`     |
| `${ssl_client_escaped_cert}` | O certificado de cliente no formato PEM, como uma string codificada para URL                                                  | `-----BEGIN%20CERTIFICATE-----%0AMIICnz...%0A-----END%20CERTIFICATE-----` |
| `${ssl_client_fingerprint}`  | O fingerprint Secure Hash Algorithm 1 (SHA-1) do certificado de cliente                                                       | `2fd4e1c67a2d28fced849`                                                   |
| `${ssl_client_i_dn}`         | A string do issuer DN do certificado de cliente                                                                               | `/C=US/ST=California/L=San Francisco/O=Example CA/CN=issuer.com`          |
| `${ssl_client_s_dn}`         | A string do subject DN do certificado de cliente                                                                              | `/C=US/ST=California/L=San Francisco/O=Example CA/CN=example.com`         |
| `${ssl_client_s_dn_parsed}`  | O subject CN extraído do certificado de cliente, como string                                                                  | `example.com`                                                             |
| `${ssl_client_serial}`       | O número de série do certificado de cliente                                                                                   | `6C:0A:83:7E:92:3B:D6:C6:E3:56:50:E7`                                     |
| `${ssl_client_v_end}`        | A data de expiração do certificado de cliente, no formato `YYYYMMDDHHmmSS`                                                    | `20230115120000`                                                          |
| `${ssl_client_v_remain}`     | O número de dias até o certificado de cliente expirar                                                                         | `100`                                                                     |
| `${ssl_client_v_start}`      | A data de início do certificado de cliente, no formato `YYYYMMDDHHmmSS`                                                       | `20230115120000`                                                          |
| `${ssl_client_verify}`       | O resultado da verificação do certificado de cliente                                                                          | `SUCCESS`, `FAILED:reason` ou `NONE`                                      |

A maioria dos serviços mTLS espera receber o próprio certificado de cliente. Uma regra da Request Phase pode enviar `${ssl_client_escaped_cert}` à origem no header `X-Forward-Client-Cert` (XFCC) com *Add Request Header*, e a origem então lê os dados do certificado nesse header.

### Variáveis em argumentos de behaviors

Um behavior que recebe um argumento pode ler as variáveis da sua fase. Por exemplo, uma regra pode gravar o device group ou a geolocalização de uma requisição em um cookie ou em um header.

Esta regra da Response Phase define um cookie que registra o host da requisição:

|    | Variável  | Operador   | Argumento  |
| -- | --------- | ---------- | ---------- |
| If | `${host}` | `is_equal` | `host.com` |

|      | Behavior              | Argumento                   |
| ---- | --------------------- | --------------------------- |
| Then | *Add Response Cookie* | `cookie-host-value=${host}` |

Quando a regra corresponde, a resposta carrega `Set-Cookie: cookie-host-value=host.com`.

Outras duas variáveis agem como funções: cada uma recebe um argumento, e as duas funcionam somente dentro do argumento de um behavior.

| Variável                        | O que retorna                                                                   | Exemplo                                                                                                                                       |
| ------------------------------- | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `${cookie_time_offset(number)}` | A data atual mais um offset de `number` segundos, para a expiração de um cookie | `cookie-name=cookie-value; Expires=${cookie_time_offset(3600)}` em [Add Cookie](#add-cookie) faz o cookie expirar 1 hora depois de ser criado |
| `${encode_base64(string)}`      | `string`, codificada em base64                                                  | `${encode_base64(http://www.yourdomain.com/)}` retorna `aHR0cDovL3d3dy55b3VyZG9tYWluLmNvbS8=`                                                 |

### Operadores

Um critério compara a sua variável com o seu argumento por meio de um operador, e a API envia o operador como um destes valores em `operator`. Os operadores que Azion Console oferece podem variar conforme a variável que o critério usa.

| Operador              | O critério corresponde quando                                                                                | Argumento         |
| --------------------- | ------------------------------------------------------------------------------------------------------------ | ----------------- |
| `is_equal`            | O valor é exatamente o argumento                                                                             | String            |
| `is_not_equal`        | O valor não é o argumento                                                                                    | String            |
| `starts_with`         | O valor começa com o argumento                                                                               | String            |
| `does_not_start_with` | O valor não começa com o argumento                                                                           | String            |
| `matches`             | O valor corresponde à expressão regular do argumento                                                         | Expressão regular |
| `does_not_match`      | O valor não corresponde à expressão regular do argumento                                                     | Expressão regular |
| `exists`              | A variável tem um valor. `${arg_search}` existe quando a query string carrega um argumento `search`          | Nenhum            |
| `does_not_exist`      | A variável não tem valor. `${arg_search}` não existe quando a query string não carrega um argumento `search` | Nenhum            |

### Condicionais

Os critérios se combinam dentro de grupos, e uma regra tem de 1 a 5 grupos de 1 a 10 critérios cada. Em um grupo, o primeiro critério carrega o condicional `if`, e cada critério seguinte carrega `and` ou `or`. Azion Console une os critérios com **And** e **Or**.

Dentro de um grupo, `and` tem precedência sobre `or`. Para definir a precedência você mesmo, divida as condições em grupos: os grupos de uma regra são unidos por `and`, então uma requisição corresponde à regra somente quando corresponde a todos os grupos. Por exemplo, uma regra que precisa de `A or B`, e também de `C`, coloca `A or B` em um grupo e `C` em um segundo grupo.

Na API, `criteria` é uma lista de grupos, e cada grupo é uma lista de objetos de critério, como em `[[{ … }]]`.

---

## Behaviors

Behaviors são o que uma regra faz com uma requisição, ou com uma resposta, que corresponde aos seus critérios, e uma regra carrega de 1 a 10 deles. Azion Console rotula a primeira linha de behavior como **Then** e cada linha seguinte como **And**, e **+ Add Behavior** adiciona uma linha. Alguns behaviors não podem ser adicionados juntos, ou só podem sob algumas condições, e Azion Console recusa essas combinações.

Na API, cada behavior é um objeto com um `type`. Um behavior que recebe um argumento o carrega em `attributes.value`, e *Capture Match Groups* carrega, em vez disso, três atributos nomeados. Azion Console recusa alguns argumentos que contêm um espaço, com `Argument cannot contain spaces, use %20 instead`.

As duas colunas de API indicam o `type` que cada fase aceita, e a coluna Exige indica o Produto que a aplicação precisa ter habilitado. Quando esse Produto está desativado, Azion Console acrescenta *- Required Application Accelerator*, *- Required Image Processor* ou *- Required Function* ao rótulo. Uma aplicação nova tem Cache e Functions ativados, e Application Accelerator e Image Processor desativados.

| Behavior                            | `type` na API, Request Phase | `type` na API, Response Phase | Exige                               |
| ----------------------------------- | ---------------------------- | ----------------------------- | ----------------------------------- |
| Add Cookie                          | `add_request_cookie`         | `set_cookie`                  | Application Accelerator             |
| Add Request Header                  | `add_request_header`         | `add_response_header`         | Nenhum                              |
| Bypass Cache                        | `bypass_cache`               | Não disponível                | Application Accelerator             |
| Capture Match Groups                | `capture_match_groups`       | `capture_match_groups`        | Application Accelerator             |
| Deliver                             | `deliver`                    | `deliver`                     | Nenhum                              |
| Deny (403 Forbidden)                | `deny`                       | Não disponível                | Nenhum                              |
| Enable Gzip                         | `enable_gzip`                | `enable_gzip`                 | Nenhum                              |
| Enforce HLS cache                   | Adicionado pela Azion        | Não disponível                | Live Ingest                         |
| Filter Request Cookie               | `filter_request_cookie`      | `filter_response_cookie`      | Application Accelerator             |
| Filter Request Header               | `filter_request_header`      | `filter_response_header`      | Nenhum                              |
| Finish Request Phase                | `finish_request_phase`       | Não disponível                | Nenhum                              |
| Forward Cookies                     | `forward_cookies`            | Não disponível                | Application Accelerator             |
| No Content (204)                    | `no_content`                 | Não disponível                | Nenhum                              |
| Optimize Images                     | `optimize_images`            | Não disponível                | Image Processor                     |
| Redirect HTTP to HTTPS              | `redirect_http_to_https`     | Não disponível                | HTTPS no workload                   |
| Redirect To (301 Moved Permanently) | `redirect_to_301`            | `redirect_to_301`             | Nenhum                              |
| Redirect To (302 Found)             | `redirect_to_302`            | `redirect_to_302`             | Nenhum                              |
| Rewrite Request                     | `rewrite_request`            | Não disponível                | Application Accelerator             |
| Run Function                        | `run_function`               | `run_function`                | Application Accelerator e Functions |
| Set Cache Policy                    | `set_cache_policy`           | Não disponível                | Nenhum                              |
| Set Connector                       | `set_connector`              | Não disponível                | Nenhum                              |

### Add Cookie

*Add Cookie* adiciona um cookie no header `Set-Cookie`, em qualquer uma das fases, e exige Application Accelerator na aplicação. Em uma regra da Response Phase, o behavior é *Add Response Cookie*. O argumento tem a forma `cookie-name=cookie-value`, e o valor pode ser uma variável, como em `cookie-name=${arg_cookie}`. Azion Console verifica o argumento e mostra `This cookie is not valid` quando não consegue ler um cookie nele.

Na Response Phase, o argumento pode carregar atributos de [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) depois do valor, cada um depois de um ponto e vírgula (`;`):

- `Expires=date`, no formato `EEE, d MMM yyyy HH:mm:ss Z`
- `Domain=domain-value`
- `Path=path-value`
- `Max-age=number`, um TTL em segundos que tem precedência sobre `Expires`
- `SameSite=value; Secure`
- `HttpOnly`

Um cookie com vários atributos os encadeia, como em `cookie-name=cookie-value; Domain=domain-value; Path=path-value; SameSite=value`. O valor de um atributo também pode ser uma variável, como em `Path=${uri}; Domain=${host}`. Na API, o `type` da Request Phase é `add_request_cookie` e o `type` da Response Phase é `set_cookie`, com o argumento em `attributes.value`.

### Add Request Header

*Add Request Header* adiciona um header à requisição que a Azion envia à origem, na Request Phase, e não exige nenhum Produto. Uma regra da Response Phase adiciona, em vez disso, o header à resposta enviada ao usuário, com o `type` de API `add_response_header`. O argumento tem a forma `Field: value`, e Azion Console recusa qualquer outro formato com `Header must follow the header-name: value format`.

O nome do header aceita somente letras (`a-z`, `A-Z`), números (`0-9`), hífens e underscores, e qualquer outro caractere torna o header inválido. O valor do header aceita letras, números e estes caracteres:

```text
_ :;.,/"'?!(){}[]@<>=-+*#$&`|~^%
```

O argumento comporta até 1.600 caracteres, e um argumento mais longo falha com `Argument too long`. Este argumento é um header válido:

```text
example-field: example-value!
```

Na API, o behavior é `add_request_header`, com o header em `attributes.value`, como `"Accept: image/webp"`. Um behavior do tipo `add_header` é recusado com `400` e o código `10039`. Os headers `Host`, `Connection`, `Range`, `X-Forward-For` e `Cdn-Loop` não podem ser sobrescritos nem filtrados.

### Bypass Cache

*Bypass Cache* envia à origem as requisições que correspondem à regra, e a Azion não armazena a resposta em cache. Ele é executado na Request Phase e exige Application Accelerator na aplicação. O behavior não altera o cache do navegador, que *Set Cache Policy* define por meio de um cache setting. Na API, ele é `{ "type": "bypass_cache" }`, sem atributos.

Bypass Cache age sobre o cache da Azion, e não sobre a camada do [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/). Uma aplicação cujos cache settings têm Tiered Cache ativado continua armazenando objetos em cache nessa camada pelo TTL mínimo. Para saber como Bypass Cache difere de um TTL de cache igual a 0, consulte [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona/). Para ignorar o cache em um path, consulte [Ignore o cache em um path](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/cache-settings/#ignore-o-cache-em-um-path).

### Capture Match Groups

*Capture Match Groups* aplica uma expressão regular a um campo da requisição e guarda os grupos que ela captura em um array temporário. Ele é executado em qualquer uma das fases e exige Application Accelerator na aplicação. *Rewrite Request* lê o array para montar um novo caminho. O array é local, então somente a regra que o captura pode lê-lo.

| Argumento             | Atributo na API  | Valores                       | Descrição                                                                                                                                                                                          |
| --------------------- | ---------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| *captured array name* | `captured_array` | String, de 1 a 10 caracteres  | O nome do array que guarda as capturas. Fora desse intervalo, Azion Console mostra `Captured array name must have at least 1 character.` ou `Captured array name must have at most 10 characters.` |
| **Subject**           | `subject`        | String, de 4 a 50 caracteres  | O campo da requisição a ser lido, escrito como uma variável, como `${uri}`                                                                                                                         |
| **Regex**             | `regex`          | String, de 1 a 255 caracteres | A expressão regular. Cada grupo a ser capturado fica entre parênteses                                                                                                                              |

Uma captura é lida como `%{name[index]}`. Por exemplo, com `capture` como nome do array, `${uri}` como subject e `^(.*/)([^/]*)$` como expressão regular, uma requisição para `/path/image.jpg` preenche três entradas:

- `%{capture[0]} = "/path/image.jpg"`
- `%{capture[1]} = "/path/"`
- `%{capture[2]} = "image.jpg"`

Um grupo também pode ter um nome, na notação `?<name>`, e a sua captura é então lida por esse nome, em vez de por um índice. Esta expressão regular nomeia os dois grupos `path` e `filename`: `^(?<path>.*/)(?<filename>[^/]*)$`.

### Deliver

*Deliver* encerra o processamento da requisição e entrega o conteúdo ao usuário, e as regras seguintes não são executadas. Ele é executado em qualquer uma das fases, não exige nenhum Produto e não recebe argumento. Na API, ele é `{ "type": "deliver" }`.

### Deny (403 Forbidden)

*Deny (403 Forbidden)* responde à requisição com uma página `403 Forbidden` e encerra o processamento da requisição. Ele é executado na Request Phase, não exige nenhum Produto e não recebe argumento. Na API, ele é `{ "type": "deny" }`.

### Enable Gzip

*Enable Gzip* comprime o conteúdo com gzip quando o navegador do usuário oferece suporte a isso. Ele é executado em qualquer uma das fases, não exige nenhum Produto e é `{ "type": "enable_gzip" }` na API. Para ativar a compressão em uma aplicação, consulte [Comprima as respostas de uma aplicação com gzip](/pt-br/documentacao/guias/performance-e-confiabilidade/otimizacao-de-entrega/gzip-compression/).

### Enforce HLS cache

*Enforce HLS cache* impõe a política de cache que a Azion define para transmissões HLS ao vivo, e exige Live Ingest. A Azion adiciona o behavior a uma regra da Request Phase toda vez que você seleciona uma fonte Live Ingest. O behavior faz duas coisas: ignora as regras de cache da aplicação e aplica a política de HLS ao vivo.

| Objeto             | Tempo de cache |
| ------------------ | -------------- |
| Playlists, `.m3u8` | 5 segundos     |
| Chunks, `.ts`      | 60 segundos    |

Para aplicar a política a um stream, consulte [Implemente cache HLS para streaming ao vivo](/pt-br/documentacao/guias/midia-e-streaming/streaming/implementar-cache-hls/).

### Filter Request Cookie

*Filter Request Cookie* remove um cookie da requisição que a Azion envia à origem, e exige Application Accelerator na aplicação. Uma regra da Response Phase remove, em vez disso, um cookie da resposta enviada ao usuário, com o `type` de API `filter_response_cookie`. O argumento é `cookie-name`, para remover o cookie, ou `cookie-name=cookie-value`, para remover somente esse valor. Na API, o `type` da Request Phase é `filter_request_cookie`.

### Filter Request Header

*Filter Request Header* remove um header da requisição que a Azion envia à origem, e não exige nenhum Produto. Uma regra da Response Phase remove, em vez disso, um header da resposta enviada ao usuário, com o `type` de API `filter_response_header`. O argumento é o nome do header, como `Header-Name`. Na API, o `type` da Request Phase é `filter_request_header`.

Cinco headers não podem ser filtrados nem sobrescritos:

- `Host`
- `Connection`
- `Range`
- `X-Forward-For`
- `Cdn-Loop`

### Finish Request Phase

*Finish Request Phase* encerra a Request Phase. Os behaviors depois dele na regra, e as regras depois dessa regra, não são executados. Ele é executado na Request Phase, não exige nenhum Produto e é `{ "type": "finish_request_phase" }` na API.

### Forward Cookies

*Forward Cookies* faz a Azion encaminhar aos usuários o header `Set-Cookie` que a origem retorna, mesmo quando a resposta vem do cache. Ele é executado na Request Phase, exige Application Accelerator na aplicação e é `{ "type": "forward_cookies" }` na API. Uma resposta em cache pode então carregar o `Set-Cookie` da sessão de outro usuário. Para manter as sessões separadas, consulte [Encaminhe cookies da origem ao usuário](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/cache-settings/#encaminhe-cookies-da-origem-ao-usuario).

Cookies criados com JavaScript são uma alternativa ao header de resposta `Set-Cookie`: um script os cria, lê e expira por meio da propriedade `document.cookie`. Um cookie JavaScript tem este formato:

```javascript
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2020 12:00:00 UTC; path=/";
```

A Azion não filtra o header de requisição `Cookie` por padrão, qualquer que seja a configuração de Forward Cookies, então os cookies JavaScript chegam à origem. Para mais informações, consulte [JavaScript Cookies](https://www.w3schools.com/js/js_cookies.asp).

### No Content (204)

*No Content (204)* responde com `204` em vez do status code que a origem retorna. Ele é executado na Request Phase, não exige nenhum Produto e é `{ "type": "no_content" }` na API.

### Optimize Images

*Optimize Images* aplica [Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/configuracoes/) às requisições que correspondem à regra, e exige Image Processor na aplicação. Ele é executado na Request Phase. Na API, ele é `{ "type": "optimize_images" }`: não recebe atributos, e uma regra pode carregá-lo como o seu único behavior.

### Redirect HTTP to HTTPS

*Redirect HTTP to HTTPS* redireciona para HTTPS uma requisição feita por HTTP, e não faz nada com uma requisição já feita por HTTPS. Ele é executado na Request Phase e é `{ "type": "redirect_http_to_https" }` na API. Ele exige HTTPS habilitado nas configurações de protocolo do [workload](/pt-br/documentacao/plataforma/workloads/) que entrega a aplicação.

### Redirect To

*Redirect To (301 Moved Permanently)* e *Redirect To (302 Found)* enviam o usuário para a URL ou a URI do argumento, com esse status code. Use `301` quando um caminho muda de forma definitiva, e `302` quando a mudança é temporária. Os dois behaviors encerram o processamento da requisição, são executados em qualquer uma das fases e não exigem nenhum Produto. Em uma regra da Response Phase, eles são executados somente quando a origem retorna `404`.

Azion Console pede o argumento com `Redirect target is required` e recusa um espaço nele com `Redirect target cannot contain spaces, use %20 instead`. Na API, os tipos são `redirect_to_301` e `redirect_to_302`, com o destino em `attributes.value`. Este behavior envia o leitor de uma FAQ para a versão em inglês dela:

| Behavior                  | Argumento    |
| ------------------------- | ------------ |
| *Redirect To (302 Found)* | `/en-us/faq` |

### Rewrite Request

*Rewrite Request* altera o caminho do recurso que a Azion requisita à origem. Ele é executado na Request Phase, exige Application Accelerator na aplicação e é `rewrite_request` na API, com o novo caminho em `attributes.value`. O novo caminho pode combinar uma string, as variáveis da Request Phase e as capturas de *Capture Match Groups*, escritas como `%{name[index]}`.

Por exemplo, dois behaviors em uma regra enviam à origem uma requisição para `/original/image.jpg` como `/new/image.jpg`:

| Behavior               | Argumento                                                                         |
| ---------------------- | --------------------------------------------------------------------------------- |
| *Capture Match Groups* | *captured array name* `capture`, **Subject** `${uri}`, **Regex** `/original/(.*)` |
| *Rewrite Request*      | `/new/%{capture[1]}`                                                              |

### Run Function

*Run Function* executa uma [instância de função](/pt-br/documentacao/plataforma/applications/functions-instances/) da aplicação sobre o que corresponde à regra. Ele é executado em qualquer uma das fases e exige Application Accelerator e [Functions](/pt-br/documentacao/plataforma/functions/) na aplicação. As instâncias ficam na aba **Functions Instances** da aplicação, e uma aplicação nova tem Functions ativado. Para a Response Phase, o formulário de instância de função do Azion Console informa `Only Lua functions can be used in the Response phase.`

Na API, `attributes.value` contém o ID da instância de função, e não o da função, como em `{ "type": "run_function", "attributes": { "value": <function-instance-id> } }`. Para criar uma instância, consulte [Instancie uma função em uma aplicação](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/instanciar-functions/).

### Set Cache Policy

*Set Cache Policy* aplica um [cache setting](/pt-br/documentacao/plataforma/applications/cache/cache-settings/) às requisições que correspondem à regra, e é assim que um cache setting chega a uma requisição. Ele é executado na Request Phase e não exige nenhum outro Produto. O cache setting vem primeiro, na aba **Cache Settings** da aplicação, e o behavior então o nomeia em uma segunda lista.

O cache setting define por quanto tempo um objeto fica em cache. A sua seção [Application Accelerator](/pt-br/documentacao/plataforma/applications/cache/cache-settings/#application-accelerator) contém as variações que definem a cache key. Na API, `attributes.value` contém o ID do cache setting. A API retorna esse ID como um inteiro, mesmo quando a requisição o envia como string. Um cache setting que uma regra aplica não pode ser excluído: a API responde `400` com o código `21014`.

### Set Connector

*Set Connector* envia as requisições que correspondem à regra a um [connector](/pt-br/documentacao/plataforma/connectors/), que alcança a origem. No Azion Console, as origens foram redesenhadas como connectors, e este behavior nomeia um connector. Ele é executado na Request Phase e não exige nenhum Produto, então uma regra com `${uri}` e *Set Connector* funciona em uma aplicação sem Application Accelerator. Na API, `attributes.value` contém o ID do connector, como mostra a seção API.

---

## API

Toda operação de regra é autenticada e fica em `https://api.azion.com/v4/workspace/applications/<application-id>`. Uma requisição carrega um personal token no header `Authorization`, com o esquema `Token`. Uma requisição com corpo também carrega `Content-Type: application/json`.

| Operação                     | Request Phase                             | Response Phase                              |
| ---------------------------- | ----------------------------------------- | ------------------------------------------- |
| Criar uma regra              | `POST /request_rules`                     | `POST /response_rules`                      |
| Listar as regras da fase     | `GET /request_rules`                      | `GET /response_rules`                       |
| Consultar uma regra          | `GET /request_rules/{request_rule_id}`    | `GET /response_rules/{response_rule_id}`    |
| Substituir uma regra         | `PUT /request_rules/{request_rule_id}`    | `PUT /response_rules/{response_rule_id}`    |
| Atualizar parte de uma regra | `PATCH /request_rules/{request_rule_id}`  | `PATCH /response_rules/{response_rule_id}`  |
| Excluir uma regra            | `DELETE /request_rules/{request_rule_id}` | `DELETE /response_rules/{response_rule_id}` |
| Reordenar as regras          | `PUT /request_rules/order`                | `PUT /response_rules/order`                 |

Uma criação responde `202` com um `state` igual a `pending`, e uma listagem responde `200`. A chamada de reordenação recebe um array `order` que lista os IDs das regras da fase na nova ordem.

Esta chamada cria uma regra da Request Phase que envia toda requisição da aplicação a um connector:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/applications/<application-id>/request_rules \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "send-to-connector",
  "active": true,
  "criteria": [[{ "variable": "${uri}", "conditional": "if", "operator": "starts_with", "argument": "/" }]],
  "behaviors": [{ "type": "set_connector", "attributes": { "value": <connector-id> } }]
}'
```

A resposta carrega `202` e um `state` igual a `pending`. Este trecho mantém a regra como a plataforma a armazenou:

```text
{"state":"pending","data":{"id":<rule-id>,"name":"send-to-connector","active":true,"criteria":[[{"conditional":"if","variable":"${uri}","operator":"starts_with","argument":"/"}]],"behaviors":[{"type":"set_connector","attributes":{"value":<connector-id>}}],"description":"","order":0,…}}
```

A plataforma adiciona `description`, uma string vazia quando a criação não envia nenhuma, e `order`, a posição da regra na sua fase. O mesmo corpo com `${request_uri}` no lugar de `${uri}` falha com o código `25047` em uma aplicação sem Application Accelerator.

---

## CLI

Azion CLI cria uma regra com `azion create rules-engine`, que lê a regra de um arquivo JSON no formato que a API recebe. `--phase` indica a fase, e o padrão é `request`.

Este arquivo aplica um cache setting a toda requisição cujo caminho começa com `/static/`:

```json
{
  "name": "apply-static-assets-cache",
  "description": "Applies the static-assets cache setting to /static/",
  "active": true,
  "criteria": [[{ "variable": "${uri}", "operator": "starts_with", "conditional": "if", "argument": "/static/" }]],
  "behaviors": [{ "type": "set_cache_policy", "attributes": { "value": <cache-setting-id> } }]
}
```

Salve-o como `rule.json`, substitua `<cache-setting-id>` pelo ID de um cache setting da aplicação e crie a regra:

```bash
azion create rules-engine --application-id <application-id> --phase request --file rule.json
```

```text
Created Rules Engine with ID <rule-id>
```

Azion CLI recusa dois formatos antigos de arquivo de regra. Um critério com `input_value` no lugar de `argument` falha com `json: unknown field "input_value"`. Um behavior escrito como `{"type":"set_cache_settings","cache_settings_id":"<id>"}` falha com `data failed to match schemas in oneOf(RequestPhaseBehaviorRequest)`: o behavior é `set_cache_policy`, com o ID em `attributes.value`.

---

## Erros

Uma regra recusada retorna um array `errors`. Cada entrada carrega um `code`, um `title`, um `detail`, o `status` e um ponteiro `source` que indica o campo, e algumas entradas adicionam um objeto `meta`. Este corpo responde a uma regra com `${request_uri}` em uma aplicação sem Application Accelerator:

```json
{
  "errors": [
    {
      "code": "25047",
      "title": "Missing Required Modules",
      "detail": " It requires any of the following modules to be enabled: ['application_accelerator'].",
      "status": "400",
      "source": { "pointer": "/data/criteria/0/0/variable" },
      "meta": {
        "message_prefix": "",
        "owner_modules": "any",
        "missing_required_modules": ["application_accelerator"]
      }
    }
  ]
}
```

| Código  | Título                      | Status | O que causa                                                                                                                                                                                                                     | O que fazer                                                                                                                                                                        |
| ------- | --------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `10039` | Invalid Choice              | 400    | Um `type` de behavior que não é uma opção válida, como `add_header`, com o detalhe `"add_header" is not a valid choice.` O ponteiro `source` indica o behavior, como em `/data/behaviors/0/type`, e `meta.input` repete o valor | Envie um `type` da tabela de behaviors, como `add_request_header`                                                                                                                  |
| `21014` | Cannot Delete Cache Setting | 400    | Excluir um cache setting que uma regra aplica com `set_cache_policy`                                                                                                                                                            | Remova o behavior que nomeia o cache setting, ou exclua a regra, e depois exclua o cache setting                                                                                   |
| `25047` | Missing Required Modules    | 400    | Uma variável de critério cujo Produto está desativado na aplicação, como `${request_uri}` sem Application Accelerator. `meta.missing_required_modules` indica o Produto                                                         | Habilite Application Accelerator na seção **Modules** de [Main Settings](/pt-br/documentacao/plataforma/applications/main-settings/) da aplicação, ou compare `${uri}` no critério |

---

## Recursos relacionados

- [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona.md): Como uma aplicação executa as suas regras em cada fase, em que ordem e quando um behavior interrompe o restante.
- [Crie regras de request e response](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/rules-engine.md): O procedimento que cria uma regra no Azion Console.
- [Configure políticas de cache para uma aplicação](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/cache-settings.md): Os procedimentos que aplicam um cache setting, ignoram o cache em um path e encaminham cookies da origem.
- [Depure regras criadas com Rules Engine](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/debug-regras.md): Faça o debug das regras de uma aplicação com a GraphQL API, Data Stream ou Real-Time Events.
