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 });
}
}
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.comverifique o valor de
ali-real-client-ipnos 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-ipnos 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()paraasync 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
statuspara especifique o código de status retornado ao cliente.
Código de exemplo para a assinatura Tipo A original | Código de exemplo para a assinatura Tipo A com o modo bypass |
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.
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.
clique em guia Domains.
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.comcomo 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.