Instalar o Filtro de página num domínio
Quem for aprovado vê a página real, quem for reprovado vê a isca — os dois no mesmo endereço. Leva cerca de 30 minutos, mais o tempo do certificado.
A página real não é configurada em lugar nenhum: a borda busca na origem o mesmo caminho que o visitante pediu. Só a isca é um destino fixo, e é a única página que você aponta.
Criar o subdomínio da origem
Na sua hospedagem, crie um subdomínio origem apontando para a mesma pasta do site que já existe — não deixe criar pasta nova. Na Hostinger: Domínios → Subdomínios, marcando “Usar diretório public_html”.
Depois de criar, abra origem.seudominio.com no navegador. Tem que aparecer o seu site normalmente.
Se a hospedagem criar o subdomínio como ALIAS ou CNAME, ele pode arrastar endereços IPv6 que não respondem. O sintoma engana: o site funciona, mas cada visita leva 20 segundos. Prefira um registro A apontando direto para o IP do seu plano.
Ajustar o WordPress
Só se o site for WordPress. Ele guarda o próprio endereço no banco e monta todos os links a partir dele — sem este ajuste a página abre pelo domínio público, mas o código-fonte entrega o endereço da origem.
No wp-config.php, logo acima da linha /* That's all, stop editing! */:
$guard_host = $_SERVER['HTTP_X_GUARD_HOST'] ?? '';
if ($guard_host && preg_match('/^[a-z0-9.-]+$/i', $guard_host)) {
$_SERVER['HTTP_HOST'] = $guard_host;
define('WP_HOME', 'https://' . $guard_host);
define('WP_SITEURL', 'https://' . $guard_host);
define('DISABLE_WP_CRON', true);
}O DISABLE_WP_CRON não é opcional. Sem ele o WordPress chama a si mesmo através da borda a cada visita, com o PHP esperando o ciclo inteiro. São 20 segundos por visita, e nada acusa erro: o site simplesmente fica lento demais para vender.
Ele está dentro do if de propósito: o cron só é desligado nas visitas que chegam pela borda, e as tarefas agendadas do seu site principal continuam rodando.
Este ajuste conserta os links que o WordPress monta na hora. O que você já inseriu pelo construtor — principalmente imagens — fica com o endereço da origem gravado no conteúdo. Não precisa caçar essas URLs: a regra 0 do passo 5 deixa imagem, css e js passarem sempre. Se as imagens somem na aba anônima mas aparecem logado, falta a regra 0.
Cadastrar o site no painel
No painel, em Filtro de página, crie um site novo:
| Campo | O que preencher |
|---|---|
| Nome | Só para você identificar |
| Domínios públicos | promo.seudominio.com |
| Onde o conteúdo real fica | origem.seudominio.com |
| Página isca | /paginaisca/ — só o caminho, com barra no começo e no fim |
O WordPress usa barra no final dos endereços. Escrevendo /paginaisca sem ela, a origem responde um redirecionamento a cada visita reprovada — e quando ele falha, o visitante recebe a página padrão em vez da sua isca.
Apontar o DNS
Depois de salvar, o painel mostra o bloco Domínios na borda com os registros a criar. Copie os valores daquela tela, naquele momento — eles mudam toda vez que o domínio é registrado de novo.
| Tipo | Nome | Valor | TTL |
|---|---|---|---|
CNAME | promo | o endereço da borda que o painel mostra | 300 |
TXT | _acme-challenge.promo | um registro para cada valor que o painel listar | 300 |
Crie exatamente os TXT que o painel listar — pode ser um, podem ser dois. Quando são dois, têm o mesmo nome e conteúdos diferentes: não é duplicata. Criando só um, o certificado fica pendente para sempre, sem mensagem de erro. O segundo pode aparecer depois do primeiro: clique em Atualizar estado e confira se a lista cresceu.
Use TTL 300 desde o começo. Os provedores sugerem 14400, que são 4 horas — e se você precisar corrigir um valor, o antigo fica preso nesse tempo no mundo inteiro.
Se o nome promo já tiver registros A ou AAAA, apague antes: um CNAME não convive com eles. Se o subdomínio existir na hospedagem, remova lá também, senão ela recria os registros.
O painel passa a mostrar Ativo em poucos minutos. O certificado sai em seguida.
Trancar as páginas de oferta
Este passo é o que faz o filtro valer alguma coisa. Sem ele, qualquer um digita o endereço e vê a página real — e nada do resto importa. Pegue o segredo do site no painel (botão de copiar, no cadastro).
Os blocos não são intercambiáveis. Rode isto e veja o que aparece depois de server:
curl -sI https://origem.SEUDOMINIO.com/ | grep -i serverLiteSpeed, Apache ou hcdn → um dos dois primeiros. nginx → o terceiro.
Vai no .htaccess da pasta do site, antes da linha # BEGIN WordPress. Traz as exceções de wp-login/wp-admin e do cookie de login — sem elas você tranca a si mesmo pra fora do painel.
RewriteEngine On
# 0. Arquivos estáticos passam sempre (imagem/css/js não são o segredo)
RewriteRule \.(jpe?g|png|gif|webp|avif|svg|ico|css|js|mjs|woff2?|ttf|otf|eot|mp4|webm|map)$ - [L]
# 1. Fora estáticos, só a borda (com o segredo) ou o admin logado passam
RewriteCond %{REQUEST_URI} !^/(wp-login\.php|wp-admin) [NC]
RewriteCond %{HTTP_COOKIE} !wordpress_logged_in [NC]
RewriteCond %{HTTP:x-guard-auth} !^SEU_SEGREDO_AQUI$
RewriteRule ^ - [F,L]
# 2. Documento NUNCA cacheia; estático cacheia forte (senão vira 429)
<IfModule mod_headers.c>
SetEnvIf Request_URI "\.(jpe?g|png|gif|webp|avif|svg|ico|css|js|mjs|woff2?|ttf|otf|eot|mp4|webm|map)$" ESTATICO=1
Header always set Cache-Control "private, no-store" env=!ESTATICO
Header always set Cache-Control "public, max-age=31536000, immutable" env=ESTATICO
</IfModule>Há um lugar para trocar: o SEU_SEGREDO_AQUI pelo segredo do painel. Nenhum endereço para digitar, nenhuma lista de páginas para manter.
Trancando só os nomes das páginas, toda oferta nova que você esquecesse de acrescentar nasceria aberta — com o sitemap do WordPress entregando o nome de graça. Trancando tudo, a oferta some de todos os endereços, e qualquer página futura já nasce protegida.
O cookie de login deixa passar quem já entrou (o editor carrega numa pré-visualização que não passa pela borda). O wp-login/wp-admin deixa a tela de login abrir. Nenhuma abre brecha na oferta: o cookie só nasce depois do login com senha.
A origem fica em nuvem cinza (Somente DNS): quem serve é a hospedagem, e é ela que lê a trava. A borda busca a origem direto, com o segredo.
Conferir e testar
No painel do site, clique em Conferir instalação. São oito checagens — todas de coisas que, quando estão erradas, não geram mensagem de erro nenhuma:
- 01A origem recusa quem vem de forasem isso o filtro é decorativo
- 02A origem responde para a bordao segredo está certo dos dois lados
- 03O documento não fica em cache públicoo vazamento por CDN
- 04O domínio público passa pela bordaum raspador recebe coisa diferente
- 05A validação de certificado passa livrea renovação não vai quebrar
- 06A borda não atrasa a páginacompara com a origem sozinha
- 07A página isca abre diretosem redirecionamento no caminho
- 08Imagem, CSS e JS podem ir pro cachese estiverem como no-store, a hospedagem corta com 429
O teste de dez segundos
Com a regra “só quem vem de anúncio” ligada, abra os dois endereços no seu navegador:
https://promo.seudominio.com/paginareal/?gclid=teste → página real
https://promo.seudominio.com/paginareal/ → página iscaA barra continua mostrando /paginareal/ nos dois casos. É proxy, não redirecionamento — quem foi reprovado não tem como perceber que foi filtrado.
Fazer a conversão do Google Ads marcar
Não tem nada a ver com o filtro, mas é onde a campanha silenciosamente deixa de dar retorno: a venda acontece e o Google nunca fica sabendo de qual anúncio ela veio.
Por que quebra
O clique chega com um gclid, que o Google guarda num cookie do domínio da sua página. O checkout está em outro domínio e não enxerga esse cookie. Se o gclid não for junto na URL, a conversão fica órfã.
A correção
Um script que copia os parâmetros da URL para os links de saída. Cole no <head> da página de oferta:
<script>!function(){document.addEventListener("DOMContentLoaded",function(){
var q = new URLSearchParams(window.location.search);
var pular = ["k", "_verificar"];
document.querySelectorAll("a").forEach(function(a){
try {
var u = new URL(a.href);
q.forEach(function(v,k){
if (pular.indexOf(k) < 0 && !u.searchParams.has(k)) u.searchParams.set(k, v);
});
a.href = u.toString();
} catch(e) {}
});
});}()</script>Todo tutorial de repasse de parâmetro copia tudo. Na sua página não pode: sem a lista, a chave de URL iria junto para o checkout — na URL dele, no referrer e no painel da plataforma. Se o seu parâmetro tiver outro nome, troque "k" pelo nome configurado no painel.
O checkout precisa ter a tag de conversão na página de obrigado (ou enviar pela API). E confira se sobrou tag antiga de outra conta: se a campanha roda numa conta e a conversão foi criada na outra, não marca. O filtro não atrapalha — a URL chega inteira, gclid incluído.