1
resposta

[Bug] Problema de CORS

Utilizei os arquivos disponibilizados por vocês neste segundo curso e executei corretamente os comandos para a criação de Pods, Services (SVC) e ConfigMaps necessários. Também criei uma notícia, porém o portal não está exibindo as informações relativas a essas notícias criadas. No console da página do http://localhost:30000/, o erro que aparece é o seguinte:

localhost/:1 Access to XMLHttpRequest at 'localhost:30001//noticias.php' from origin 'http://localhost:30000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrome-extension, chrome-untrusted, data, http, https, isolated-app.Understand this error
:30001//noticias.php:1 
Failed to load resource: net::ERR_FAILED

Observação: vi que tanto acessando http://localhost:30001/noticias.php quanto http://localhost:30001//noticias.php os dados das notícias aparecem normalmente.

1 resposta

Luana, esse erro aparece porque o JavaScript do portal está montando a URL do backend sem o esquema “http://”. O navegador nem chega a enviar a requisição e exibe:

Cross-origin requests are only supported for protocol schemes: http, https…

1 — Corrija o endereço da API no portal

Abra o ConfigMap (ou o arquivo .js que define a variável de ambiente) e altere:

API_URL=localhost:30001/noticias.php        # valor atual (incorreto)

para

API_URL=http://localhost:30001/noticias.php # valor correto

Depois aplique a mudança e reinicie o deployment do portal:

kubectl apply -f portal-configmap.yaml
kubectl rollout restart deployment portal

2 — Habilite CORS no serviço de notícias

Com o esquema corrigido, a requisição finalmente sairá do portal (porta 30000) para o backend (porta 30001). Como são origens diferentes, o backend precisa liberar CORS. No início de noticias.php adicione:

header("Access-Control-Allow-Origin: http://localhost:30000");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit; // pré-flight
}

Para desenvolvimento você pode usar * em vez de indicar a origem, mas em produção limite o domínio.

Recrie a imagem ou mapeie o arquivo atualizado no pod e faça:

kubectl rollout restart deployment noticias

3 — Teste no navegador

Abra DevTools → Network em http://localhost:30000 e verifique:

  • A requisição a /noticias.php aparece?
  • O status é 200?
  • O cabeçalho Access-Control-Allow-Origin vem com http://localhost:30000?

Se tudo isso estiver ok, as notícias devem ser exibidas no portal.

4 — Alternativas sem lidar com CORS

  • Ingress: exponha frontend e backend no mesmo host/porta (http://portal.local/…).
  • Proxy reverso no pod do portal: o JS fala com /api, e o proxy redireciona para noticias.

Caso ainda encontre problemas, compartilhe aqui o trecho do ConfigMap ou do noticias.php e a gente olha junto.