---
title: "Geração Dinâmica de Chaves de Cache de Borda para Consistência de SEO Multilíngue"
---

# Geração Dinâmica de Chaves de Cache de Borda para Consistência de SEO Multilíngue

Quando um site fornece o mesmo conteúdo em várias línguas, a camada de borda torna‑se um ponto crítico de controle. Uma estratégia bem‑desenhada de chave de cache pode entregar a versão correta do idioma instantaneamente **enquanto** protege a credibilidade do site perante os motores de busca. Neste artigo exploramos por que as chaves estáticas tradicionais são insuficientes, como funciona a composição dinâmica de chaves na borda e quais padrões mantêm os sinais de [SEO](https://moz.com/learn/seo/what-is-seo) intactos entre fronteiras.

## O problema das chaves “tamanho‑único”

A maioria dos provedores de CDN usa, por padrão, um hash simples da URL da requisição. Isso funciona para sites monolíngues, mas quando um usuário solicita `/en/about` e outro solicita `/fr/about`, o hash difere apenas pelo segmento de idioma. O CDN armazenará dois objetos distintos, o que é aceitável, porém a chave de cache ainda carece da nuance necessária para a lógica de **hreflang** e **canonical**. Os motores de busca tratam esses objetos como recursos separados; se a mesma página for armazenada sob múltiplas chaves sem os sinais corretos, podem surgir penalidades por conteúdo duplicado e o orçamento de rastreamento pode ser desperdiçado ao buscar ativos idênticos repetidamente.

## Ingredientes essenciais de uma chave de cache multilíngue

Uma chave de cache multilíngue robusta costuma combinar as seguintes dimensões:

* **Código de idioma** – extraído do caminho da URL, sub‑domínio ou cabeçalho `Accept-Language`.
* **Indicação de região** – opcional, derivada de dados GeoIP, para orientar variações regionais como moeda ou unidades de medida.
* **Classe de dispositivo** – mobile versus desktop, importante para design responsivo.
* **Cabeçalhos de requisição variáveis** – por exemplo `Accept-Encoding` para gzip vs. brotli, ou `User‑Agent` para testes A/B.

Essas dimensões são concatenadas em ordem determinística e são hash apenas após a normalização. O resultado é uma string leve que o servidor de borda usa para busca, refletindo ainda todo o contexto da requisição.

## Pipeline de normalização na borda

Antes que a chave seja montada, a função de borda deve normalizar a requisição:

1. **Remover parâmetros de rastreamento** – excluir strings de consulta `utm_*` para que tags de análise não fragmentem o cache.
2. **Canonicalizar o caminho** – resolver barras duplicadas, segmentos relativos (`../`) e barras finais conforme a política de URL do site.
3. **Mapear aliases de idioma** – tratar `/en-us` e `/en` como equivalentes se o site oferecer apenas uma variante em inglês.
4. **Forçar minúsculas** – URLs são insensíveis a maiúsculas/minúsculas na maioria dos servidores; forçar minúsculas elimina variações desnecessárias.

A requisição normalizada é então enviada ao gerador de chave. A seguir, um exemplo simplificado de pseudo‑código que pode ser executado em Cloudflare Workers, AWS Lambda@Edge ou qualquer runtime de borda baseado em V8.

```javascript
// edge-key-generator.js
export async function handle(event) {
  const { request } = event;
  const url = new URL(request.url);

  // 1️⃣ Remove analytics parameters
  for (const param of url.searchParams.keys()) {
    if (param.startsWith('utm_')) url.searchParams.delete(param);
  }

  // 2️⃣ Normalize pathname
  url.pathname = decodeURI(url.pathname)
                    .replace(/\/{2,}/g, '/')
                    .replace(/\/$/, '');

  // 3️⃣ Detect language from path or header
  const langMatch = url.pathname.match(/^\/([a-z]{2})(?:-[A-Z]{2})?(?=\/|$)/);
  const language = langMatch ? langMatch[1] : request.headers.get('Accept-Language')?.split(',')[0]?.slice(0,2) || 'en';

  // 4️⃣ Build key components
  const region = request.headers.get('CF-IPCountry') || 'XX';
  const device = request.headers.get('User-Agent')?.includes('Mobile') ? 'mobile' : 'desktop';

  // 5️⃣ Assemble deterministic key
  const rawKey = `${language}|${region}|${device}|${url.pathname}`;
  const cacheKey = crypto.subtle.digest('SHA-256', new TextEncoder().encode(rawKey))
                    .then(buf => [...new Uint8Array(buf)].map(b => b.toString(16).padStart(2, '0')).join(''));

  // Attach the cache key for downstream caching logic
  request.headers.set('X-Edge-Cache-Key', await cacheKey);
  return request;
}
```

O script demonstra como **remover parâmetros de rastreamento**, **normalizar a URL**, **extrair idioma e região**, e finalmente gerar o hash da string composta. O cabeçalho resultante `X-Edge-Cache-Key` pode ser consumido pelo mecanismo de cache do CDN.

## Integrando tags hreflang e canonical

Mesmo com uma chave de cache perfeita, o payload HTML ainda deve conter os links **hreflang** corretos e uma tag **canonical** autopreferenciada. Funções de borda podem injetar ou modificar essas tags em tempo real. Um snippet JSON‑LD leve também pode ser adicionado para melhorar a visibilidade dos **dados estruturados** em cada versão de idioma.

```mermaid
graph TD
  A["Requisição Entrante"] --> B["Camada de Normalização"]
  B --> C["Compositor de Chave"]
  C --> D["Lookup no Cache (X-Edge-Cache-Key)"]
  D -->|Acerto| E["Resposta do Cache"]
  D -->|Falha| F["Processamento de Origem"]
```

## Veja Também

- <https://developers.cloudflare.com/cache/about/cache-keys/>
- <https://developers.google.com/search/docs/advanced/crawling/localized-versions>
- <https://support.google.com/webmasters/answer/182192?hl=en>
- <https://learn.akamai.com/en-us/webhelp/edgeworkers/v0.5/user_guide/edgeworkers_cache_key.html>
- <https://developers.cloudflare.com/cache/about/cache-keys>