# Device Groups

Um device group é um nome e uma expressão regular que uma [aplicação](/pt-br/documentacao/plataforma/applications/) compara com o header `User-Agent` de cada requisição. Uma requisição cujo header corresponde à expressão pertence ao grupo, então uma [regra](/pt-br/documentacao/plataforma/applications/rules-engine/) ou um [cache setting](/pt-br/documentacao/plataforma/applications/cache/cache-settings/) pode tratar esses dispositivos de forma separada do restante. Cada aplicação tem os seus próprios device groups, e Azion Console os lista na aba **Device Groups** da aplicação.

---

## Campos do device group

Um device group carrega dois campos que você define e um ID que a plataforma atribui. Uma regra se refere a um device group pelo nome, e um cache setting se refere a ele pelo ID.

| Campo                  | Tipo    | Descrição                                                                                                                                                                                                                                                                                                                                     |
| ---------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name**               | string  | O nome do grupo. Uma regra compara `${device_group}` com esse nome, e a cache key de uma cópia que varia por dispositivo termina com ele. Azion Console mostra `Name must be alphanumeric` para um nome com outros caracteres                                                                                                                 |
| **Regular Expression** | string  | A expressão comparada com o conteúdo do header `User-Agent`, na seção **Match to User-Agent** do formulário. Ela segue o padrão PCRE. Azion Console mostra `Enter a valid regular expression pattern.` para uma expressão que não consegue ler, e `User Agent cannot contain emojis or null bytes` para uma expressão que carrega um dos dois |
| ID                     | integer | O identificador do grupo. O campo `cache_vary_by_devices.device_group` de um cache setting lista os device groups por esse ID                                                                                                                                                                                                                 |

---

## Header User-Agent

O header de requisição `User-Agent` carrega informações sobre o cliente que envia a requisição: o navegador, o sistema operacional, a versão e o fabricante. O header segue esta sintaxe:

```text
User-Agent: <product>/<product-version> <comment>
```

| Parte             | O que contém                                                                 |
| ----------------- | ---------------------------------------------------------------------------- |
| `product`         | O identificador do produto                                                   |
| `product-version` | O número de versão do produto                                                |
| `comment`         | Informações do sistema, o nome da plataforma e os seus detalhes, e extensões |

Por exemplo, uma requisição do Mozilla Firefox em um computador Windows carrega este header:

```text
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
```

## Correspondência com o User-Agent

Uma aplicação compara a **Regular Expression** de um device group com o conteúdo do header `User-Agent`, e uma requisição pertence ao grupo quando a expressão corresponde. A expressão não precisa corresponder ao header inteiro, porque uma correspondência com parte dele basta. Por exemplo, um grupo chamado `Mobile` com esta expressão corresponde aos headers da maioria dos dispositivos móveis:

```text
(Mobile|iP(hone|od)|BlackBerry|IEMobile)
```

### Ordem de correspondência

Quando um header `User-Agent` corresponde a mais de um device group, a requisição recebe o primeiro grupo que corresponde, do primeiro ao último na lista de device groups. A posição das palavras que correspondem dentro do header não muda o resultado. Por exemplo, uma aplicação tem estes três device groups, nesta ordem:

| Ordem | Device group | Expressão regular   |
| ----- | ------------ | ------------------- |
| 1     | `Mobile`     | `(Mobile\|Android)` |
| 2     | `Tablet`     | `(iPad\|Android)`   |
| 3     | `Desktop`    | `(Chrome\|Mozilla)` |

Um header que contém `Android Tablet Mobile (Mozilla Firefox)` corresponde às três expressões, e a requisição recebe `Mobile`, o primeiro da lista. Um header que contém `iPad Apple Webkit Mobile` corresponde a `Tablet` por meio de `iPad`. Ainda assim, a requisição recebe `Mobile`, porque `Mobile` também corresponde e vem primeiro.

---

## Variável do Rules Engine

No Rules Engine para Applications, a variável `${device_group}` contém o nome do device group ao qual a requisição pertence. Um critério a compara com o nome de um grupo, usado como argumento, então os behaviors da regra se aplicam somente às requisições desse grupo. A variável exige [Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/) na aplicação.

Este critério corresponde a uma requisição do device group `Mobile`:

| Condicional | Variável          | Operador   | Argumento |
| ----------- | ----------------- | ---------- | --------- |
| `if`        | `${device_group}` | `is_equal` | `Mobile`  |

Um critério também pode identificar um dispositivo sem device group, comparando `${http_user_agent}` com uma string ou com uma expressão regular. Este critério corresponde a uma requisição de um iPhone:

| Condicional | Variável             | Operador  | Argumento    |
| ----------- | -------------------- | --------- | ------------ |
| `if`        | `${http_user_agent}` | `matches` | `(?i)iPhone` |

Para todas as variáveis e todos os operadores que uma regra pode usar, consulte [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/).

---

## Variação de cache

Um cache setting pode entregar uma versão de um objeto a todos os dispositivos, ou manter uma cópia separada para cada device group que ele nomeia. No Azion Console, o controle é **Cache vary by Devices** › **Behavior**, na seção **Application Accelerator** do cache setting. Na API, o controle grava `modules.application_accelerator.cache_vary_by_devices`, cujo campo `device_group` lista os device groups por ID. Um cache setting que não define o controle carrega `"behavior": "ignore"` e uma lista `device_group` vazia. Azion CLI não tem flag para a variação por device group.

A seção **Application Accelerator** de um cache setting exige Application Accelerator na aplicação, e, sem esse Produto, a API recusa os campos da seção com o erro `21013`. Para os valores que cada campo aceita, consulte [Configurações do Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/#cache-variation).

Cada cópia que varia por device group tem a sua própria cache key, que termina em `@@` e no nome do device group, como `httpwww.example.com/@@Mobile`. Um purge por URL não alcança essas cópias, então purgue-as por cache key ou com um wildcard. Para o formato da key, consulte [Cache keys](/pt-br/documentacao/plataforma/applications/cache/cache-keys/#variacoes). Para os tipos de purge, consulte [Real-Time Purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/#purge-por-url).

---

## Recursos relacionados

- [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona.md): Como uma aplicação executa as suas regras e o seu cache sobre uma requisição.
- [Crie device groups](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/criar-device-groups.md): O procedimento que cria um device group no Azion Console.
- [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos.md): A primeira aplicação, antes de você adicionar device groups a ela.
- [Glossário](/pt-br/documentacao/plataforma/applications/glossario.md): Os termos que uma aplicação usa, device group entre eles.
