🎉 USE O CUPOM DESCONTO.FULL | 20% OFF acima de R$ 50,00

Como corrigir o conflito de nonce expirado entre WP Rocket e reCAPTCHA

Time Full Services Time Full Services
Tipo Performance & Velocidade
Nome do erro Conflito de nonce expirado entre WP Rocket e reCAPTCHA EN: Expired nonce conflict between WP Rocket and reCAPTCHA
Severidade Grave
Descrição O nonce do reCAPTCHA expira com o WP Rocket quando a página do formulário é entregue do cache com um token de segurança gerado horas antes. O visitante envia esse nonce já vencido, o reCAPTCHA ou o formulário rejeita a verificação e a submissão falha, mesmo o usuário sendo humano.

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

  1. 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.
  2. 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/(.*)
  3. 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
  4. 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
  5. 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
<?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;
} );

Perguntas frequentes

Por que o reCAPTCHA falha só depois de algumas horas com o WP Rocket ativo?
Porque o WP Rocket serve uma cópia em cache da página com um nonce gerado quando o cache foi criado. Esse token tem validade padrão de 12 a 24 horas. Passado esse tempo, o visitante envia um nonce já expirado e o reCAPTCHA ou o formulário rejeita o envio. Logo após limpar o cache funciona porque um nonce novo é gerado.
O que é um nonce e por que ele expira no cache?
Nonce é um token de uso único e temporário que o WordPress cria para garantir que uma requisição partiu da página legítima. Ele é válido por uma janela de tempo, por padrão 86400 segundos. Quando o WP Rocket congela a página em HTML estático, o nonce fica preso no valor antigo e expira sem ser renovado, ao contrário de uma página dinâmica que gera um token novo a cada carregamento.
Excluir a página do cache não vai deixar o site lento?
Não de forma perceptível. Você exclui apenas a página específica que contém o formulário, como a de contato ou o checkout, e o restante do site continua totalmente cacheado pelo WP Rocket. O ganho de performance global é mantido e só a página dinâmica passa a ser servida fresca, com nonce válido.
Preciso excluir o reCAPTCHA do Delay JavaScript Execution também?
Sim, na maioria dos casos. Se o script do Google reCAPTCHA for atrasado pelo Delay JavaScript Execution, o token pode não ser gerado antes de o visitante enviar o formulário. Adicionar os padrões google.com/recaptcha e gstatic.com/recaptcha à lista de exclusão garante que o reCAPTCHA carregue a tempo.
O problema afeta Contact Form 7, WPForms e WooCommerce da mesma forma?
Sim, porque todos usam nonce e reCAPTCHA na página que pode ser cacheada. A página de contato com Contact Form 7 ou WPForms e a página de checkout do WooCommerce são as mais afetadas. A solução é a mesma: excluir essas páginas do cache do WP Rocket e manter o script do reCAPTCHA fora do Delay JavaScript.
Como sei se o erro é do cache e não da chave do reCAPTCHA?
Limpe o cache do WP Rocket e teste o envio numa janela anônima logo em seguida. Se funcionar imediatamente após limpar e voltar a falhar horas depois, o problema é o nonce vindo do cache. Se falhar sempre, mesmo com cache limpo, aí o foco é a chave do site ou o domínio configurado no painel do reCAPTCHA.
Reduzir a validade do nonce resolve sem excluir a página do cache?
Ajuda apenas em parte e tem efeito colateral. Encurtar o nonce_life reduz a janela em que o token cacheado fica válido, mas se a validade ficar menor que o tempo de vida do cache o problema volta, e um nonce curto demais no site inteiro pode deslogar usuários. O caminho confiável é excluir a página do formulário do cache.

Seja PRO.

Tenha acesso a snippets de código premium — PHP, JavaScript, CSS e HTML prontos para usar em seus projetos.

Conhecer o plano Pro →

Uma nova era para o WordPress.

A FULL Services redefine o CMS com uma arquitetura modular que transforma o WordPress em um motor de crescimento digital. 

Painéis personalizados

Um novo nível de controle para o WordPress. Acompanhe métricas, automações e evolução do seu site em um único painel visual.

A força por trás de grandes marcas

Para agências, estúdios e profissionais independentes que desejam oferecer soluções de alto nível com sua própria marca.

Componentes

Hero Sections

30 componentes

Seções de CTA

14 componentes

Login

14 componentes

Blog

14 componentes

Cabeçalhos

24 componentes

Seções de FAQ

53 componentes

Cadastro

53 componentes

Blog individual

53 componentes

Rodapés

28 componentes

Seções de contato

27 componentes

Seções de preços

27 componentes

Faixas

27 componentes

Portfólio

16 componentes

Seções de equipe

12 componentes

Números

12 componentes

Logotipos

12 componentes