Todos os produtos
Search
Central de documentação

Edge Security Acceleration:Perguntas frequentes sobre Edge Function

Última atualização: Oct 15, 2026

Não é possível obter o IP real do cliente

Sintoma

Depois que uma edge function processa uma requisição, o endereço IP obtido no cabeçalho ali-real-client-ip é sempre um IP interno, e não o IP real do cliente.

Causa

No modo fetch, a edge function atua como um proxy intermediário e envia requisições à origem. A origem recebe as requisições do edge runtime, fazendo com que o cabeçalho ali-real-client-ip retorne o IP interno do nó de borda em vez do IP real do cliente.

Solução

ative o Bypass Mode para impedir que a edge function processe as requisições. Isso preserva o IP original do cliente. Para obter instruções detalhadas, consulte a seção do modo bypass em Domain Configuration.

A tabela a seguir mostra as principais diferenças entre o modo fetch e o modo bypass.

Modo

IP real

Casos de uso

modo fetch

Retorna um endereço IP interno

Cenários em que a edge function precisa modifique o conteúdo da resposta, como compactação e reescrita.

modo bypass

Retorna o IP real do cliente

Cenários leves, como autenticação e logs.

Para implementar essa lógica no código da sua edge function, altere o ponto de entrada de async fetch(request) para async bypass(request). O objeto ResponseBypass, um utilitário integrado ao edge runtime do ESA, controla se uma requisição ignora o processamento da função:

// Entry function for bypass mode
async bypass(request) {
  // Execute pre-processing logic, such as authentication.
  const isAuthPassed = true; // Replace with your actual authentication logic.

  if (isAuthPassed) {
    // Authentication succeeded. Return true to bypass function processing.
    return new ResponseBypass(true);
  } else {
    // Authentication failed. Return false and specify a failure status code.
    return new ResponseBypass(false, { status: 403 });
  }
}
Nota
  • Quando o modo bypass está ative, a edge function não recebe o corpo da requisição. Para ler o corpo da requisição, como em uma requisição POST, use o modo fetch.

  • O modo bypass destina-se a tarefas leves, como autenticação e logs, e não à modifique da resposta com compactação ou reescrita. Além disso, não consome tempo de CPU no processamento da resposta.

verifique

Depois de ative o modo bypass, verifique se o cabeçalho ali-real-client-ip retorna o IP real do cliente por um dos seguintes métodos:

  • Execute o comando curl para verifique os cabeçalhos da resposta:

    curl -I https://your-domain.com

    verifique o valor de ali-real-client-ip nos cabeçalhos da resposta. Ele deve ser o IP público do cliente, e não um IP interno.

  • Nas ferramentas de desenvolvedor do navegador, abra o painel Network e verifique o valor de ali-real-client-ip nos cabeçalhos da resposta.

É possível modifique a chave da variável?

Não. A chave não pode ser editada após a criação. Para fazer alterações, exclua-a e adicione uma nova.

Por que o retorno é undefined?

Se a versão atual não estiver vinculada à variável ou se a chave estiver defina apenas no outro ambiente, o código retorna undefined sem lançar exceção. verifique se a chave está defina no ambiente de destino e se você reimplantou a versão após defina a chave.

As variáveis estão vinculadas a versões?

Sim. As variáveis da função são vinculadas junto com a versão. Se você atualize as variáveis no console sem publicar uma nova versão, a versão em execução não detectará a alteração.

O que fazer se a descriptografia de uma variável criptografada falhar?

Se não for possível descriptografar o valor de uma chave criptografada, a edge function retorna o erro 599. Verifique se o valor da variável foi criptografado e inserido corretamente.

Como alternar para o modo bypass modifique o código?

Use a Type A URL signing como exemplo:

  • Altere a função de entrada de async fetch() para async bypass().

  • A função deve retornar um valor construído com new ResponseBypass(), que aceita dois parâmetros:

    • O primeiro parâmetro é um booleano (true ou false) que indica se a autenticação foi bem-sucedida.

    • Se a autenticação falhar (false), passe um segundo parâmetro status para especifique o código de status retornado ao cliente.

Código de exemplo para a assinatura Tipo A original

import { createHash } from "node:crypto";

async function handleRequest(request) {
  const url = new URL(request.url);
  const path = url.pathname;
  const delta = 3600;

  const authKeyTypeA = url.searchParams.get('auth_key');

  const privateKey = 'your_secret_key'
  const currentTimestamp = Math.floor(Date.now() / 1000);

  if (!authKeyTypeA) {
    // In an authentication failure scenario, the edge node returns a 403 error to the client by default.
    return new Response('Unauthorized', { 
      status: 401,
    });
  }

  const [timestamp, rand, uid, signature] = authKeyTypeA.split('-');

  if (currentTimestamp > parseInt(timestamp)+ delta) {
    // In an authentication failure scenario, the edge node returns a 403 error to the client by default.
    return new Response('Link expired', {
      status: 403,
    });
  }

  const signString = [path, timestamp, rand, uid, privateKey].join('-');

  const md5 = createHash('md5').update(signString).digest('hex');

  if (md5 !== signature) {
  
    return new Response('Unauthorized', {
      status: 401
    });
  }

  // If the resource is on another domain, fetch it and return the response.
  // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
  // const cdnResponse = await fetch(yourUrl, request)
  // return new Response(cdnResponse.body, cdnResponse)

  // In most cases, fetching from the origin is sufficient.
  return fetch(request.url)
}

export default {
  async fetch(request) {
    return handleRequest(request)
  }
}

Código de exemplo para a assinatura Tipo A com o modo bypass

import { createHash } from "node:crypto";

    async function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const delta = 3600;

      const authKeyTypeA = url.searchParams.get("auth_key");

      const privateKey = "your_secret_key";
      const currentTimestamp = Math.floor(Date.now() / 1000);

      if (!authKeyTypeA) {
        // Authentication failed. If you pass false, the edge node returns a 403 error to the client by default.
        return new ResponseBypass(false, {
          status: 401,
        });
      }

      const [timestamp, rand, uid, signature] = authKeyTypeA.split("-");

      if (currentTimestamp > parseInt(timestamp) + delta) {
        // Authentication failed. If you pass false, the edge node returns a 403 error to the client by default.
        return new ResponseBypass(false, {
          status: 403,
        });
      }

      const signString = [path, timestamp, rand, uid, privateKey].join("-");

      const md5 = createHash("md5").update(signString).digest("hex");

      if (md5 !== signature) {
        // Authentication failed. If you pass false, the edge node returns a 403 error to the client by default.
        return new ResponseBypass(false, {
          status: 401,
        });
      }

      // Authentication succeeded. If you pass true, the request proceeds to the origin, and the response is no longer processed by this function.
      const resSuccess = new ResponseBypass(true);
      return resSuccess;
    }

    export default {
      async bypass(request) {
        return handleRequest(request);
      },
    };

Como atualize a vinculação de um nome de domínio?

Se os domínios e as rotas atuais não atenderem mais às suas necessidades, edite-os ou exclua-os.

  1. Faça login no ESA console e, no painel de navegação à esquerda, escolha Edge Computing and AI > Functions & Pages. clique em instância Functions & Pages de destino.

  2. clique em guia Domains.

  3. Na guia Domain Names, exclua um nome de domínio vinculado e adicione-o novamente. Para uma rota vinculada, edite-a ou exclua-a e adicione-a novamente.

Como vincular o Functions and Pages diretamente a um domínio raiz?

Para vincular o Functions and Pages diretamente a um domínio raiz, como example.com, use um dos seguintes métodos:

  • Custom Domains: selecione Add Domain Name e insira @.example.com como nome de domínio.

  • Routes: Selecione Add Route. Para o site, use Select Website para selecione example.com. Para Route Mode, selecione Simple Mode e deixe Route Prefix em branco.

Código de status inválido

Mensagem de erro

HttpBody.constructor: invalid status code

Causa

Os códigos de status 596, 597, 598 e 599 são reservados para uso interno do edge runtime. Não retorne esses códigos de status na sua função.

Nenhum endereço de proxy disponível

Mensagem de erro

unhandled error(13485,13477)@: Error: io error@: no available fetch proxy address now\nstacktrace:\nN/A\n

Causa 1

A URL passada para cache.put começa com https. A API de cache não suporta https. Altere https para http.

Causa 2

Uma requisição fetch tem como alvo um domínio não gerenciado pelo ESA, mas a opção cdnProxy:true está defina. Para corrigir isso, adicione o domínio ao seu service ESA ou remova a configuração cdnProxy:true.

Conexão interrompida

Mensagem de erro

Error: unhandled error(13486,13505)@: Broken connection, unexpected EOF

Causa

A origem fechou a conexão enquanto a edge function recebia dados dela.