Como corrigir o conflito de nonce expirado entre WP Rocket e reCAPTCHA
O que é o conflito de nonce do reCAPTCHA com o WP Rocket?
O conflito de nonce expirado entre WP Rocket e reCAPTCHA acontece porque o WP Rocket guarda uma cópia estática em HTML da página e a serve a todos os visitantes anônimos. Dentro dessa página há um nonce, um token de segurança do WordPress com validade padrão de 12 a 24 horas, usado pelo plugin de reCAPTCHA e pelo formulário para provar que a requisição é legítima. Quando o WP Rocket congela a página no cache, ele congela junto o nonce no estado do momento da geração. Horas depois, um visitante recebe essa página velha e envia um nonce que o servidor já considera expirado. O reCAPTCHA ou a validação do formulário rejeita a verificação e o envio falha, mesmo o usuário sendo um humano real.
Como identificar
- O formulário retorna a mensagem “A verificação do reCAPTCHA falhou. Tente novamente.” mesmo o visitante marcando o desafio corretamente.
- O envio só funciona logo depois de limpar o cache do WP Rocket e falha de novo algumas horas depois, num padrão intermitente.
- No console do navegador aparece o erro “ERROR for site owner: Invalid domain for site key” ou uma falha de token do reCAPTCHA.
- Usuários logados conseguem enviar o formulário normalmente, mas visitantes anônimos que recebem a página cacheada não conseguem.
- Plugins como Contact Form 7 ou WPForms registram “Failed to validate nonce” ou “spam” no log de envios legítimos.
Como prevenir
- Sempre adicione páginas com formulário, login ou checkout em “Nunca armazenar URLs em cache” assim que ativar o WP Rocket.
- Mantenha os scripts do Google reCAPTCHA na lista de exclusão do Delay JavaScript Execution para que o token seja gerado a tempo.
- Evite reduzir demais a validade do nonce em todo o site, pois isso pode deslogar usuários; ajuste só onde houver formulário em cache.
- Use apenas um plugin de cache de página por vez para não empilhar cópias com nonce velho em camadas diferentes.
Causa
- A página do formulário está sendo cacheada pelo WP Rocket e serve a todos um nonce gerado no momento da criação do cache, que já venceu quando o visitante envia o formulário horas depois.
- O reCAPTCHA depende do script externo do Google e este foi atrasado pela opção "Execução de JavaScript adiada" (Delay JavaScript Execution) do WP Rocket, então o token do reCAPTCHA não é gerado a tempo do envio.
- A validade do nonce, definida pelo filtro nonce_life do WordPress em 86400 segundos por padrão, é maior que zero mas menor que o tempo que a página fica no cache, criando a janela em que o token guardado já expirou.
- A página é dinâmica (contém formulário com token por sessão) mas não está listada em "Nunca armazenar URLs em cache" (Never Cache URLs), então o WP Rocket a trata como página estática.
- Um segundo plugin de cache ou o cache de página da hospedagem (LiteSpeed, Varnish) também guarda a página com o nonce velho, e excluir só no WP Rocket não resolve.
Como resolver
- Confirme que o problema é o cache da página do formulário: limpe todo o cache do WP Rocket e teste o envio imediatamente numa janela anônima. Se funcionar logo após limpar e voltar a falhar horas depois, o nonce está sendo servido velho a partir do cache, e não há erro de configuração do reCAPTCHA.
- Exclua a página do formulário do cache (Never Cache URLs): no painel, vá em Configurações -> WP Rocket -> Avançado e, no campo "Nunca armazenar URLs em cache", adicione o caminho da página que contém o formulário, um por linha. Isso faz o WP Rocket servir sempre HTML fresco, com um nonce válido, só nessa página, mantendo o restante do site cacheado.
/contato/ /fale-conosco/ /(.*)/checkout/(.*) - Exclua o script do reCAPTCHA do Delay JavaScript Execution: ainda em File Optimization, no campo de exclusão da opção "Atrasar a execução de JavaScript", adicione os padrões dos scripts do Google reCAPTCHA. Sem isso, o token não é gerado antes do visitante enviar o formulário.
google.com/recaptcha gstatic.com/recaptcha /recaptcha/api.js recaptcha - Limpe todas as camadas de cache e revalide: purgue o cache do WP Rocket e também o cache da hospedagem e do CDN, porque a página antiga com o nonce velho pode estar guardada em mais de uma camada. Depois teste o envio numa janela anônima e repita após algumas horas para confirmar que o token não expira mais.
wp rocket clean --confirm wp cache flush - Se ainda intermitente, force a regeneração do nonce no formulário: quando o formulário precisa ficar em cache por performance, use o snippet abaixo para reduzir a validade do nonce ou gere o token via AJAX no momento do envio, em vez de embutir um token fixo no HTML cacheado. Reduzir a validade encurta a janela de expiração na cópia em cache.
<?php
/**
* functions.php do tema-filho.
* Reduz a validade do nonce APENAS na pagina do formulario que precisa
* ficar em cache, encurtando a janela em que o token cacheado expira.
* Para a maioria dos casos, prefira excluir a pagina do cache (Never Cache URLs).
*/
add_filter( 'nonce_life', function ( $ttl ) {
// Aplica so onde ha formulario com reCAPTCHA; ajuste o slug da sua pagina.
if ( is_page( array( 'contato', 'fale-conosco' ) ) ) {
return 2 * HOUR_IN_SECONDS; // 7200s em vez dos 86400s padrao
}
return $ttl;
} );
/**
* Garante que a pagina do formulario nunca seja cacheada pelo WP Rocket,
* mesmo que a configuracao do painel seja perdida numa atualizacao.
*/
add_filter( 'rocket_cache_reject_uri', function ( $uris ) {
$uris[] = '/contato/';
$uris[] = '/fale-conosco/';
return $uris;
} );














