Basicamente, vc precisa adicionar alguns cabeçalhos especificos.
Antes daquele seu if
, adicione isto:
$method = $_SERVER['REQUEST_METHOD'];
$origin = $_SERVER['HTTP_ORIGIN'];
if ($method === 'OPTIONS') {
$requestMethod = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'];
$requestHeaders = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'];
header("Access-Control-Allow-Methods: $requestMethod");
header("Access-Control-Allow-Headers: $requestHeaders");
}
header("Access-Control-Allow-Origin: $origin");
header('Access-Control-Allow-Credentials: true');
// ...
Antes de alguns tipos de requisições o navegador faz uma requisição extra com o método OPTIONS chamada de pre-flight request.
Na pre-flight request ele espera que o servidor responda quais métodos e quais cabeçalhos ele permite. O cabeçalho "Access-Control-Allow-Headers' é importante porque seu cliente pode querer enviar cabeçalhos diferentes e vc precisa permiti-los.
O cabeçalho 'Access-Control-Allow-Origin' deve estar presente em qualquer requisição. Seu valor pode ser '*' indicando que qualquer origin é permitida, mas o asterisco é inválido quando vc está usando 'Access-Control-Allow-Credentials: true', por isso temos que usar a origin exata do cliente.
O cabeçalho 'Access-Control-Allow-Credentials: true' é importante, pois permite que o cliente envie cookies junto com a requisição.
Não tenho certeza se isso cobre todos os casos de uso, mas acredito que é um bom começo para o que vc precisa. Para entender melhor o protocolo CORS, recomendo a especificação: https://fetch.spec.whatwg.org/#http-cors-protocol
Não sei se entendi muito bem, mas não tenho como mudar o cabeçalho do outro domínio já que não tenho acesso a eles. O meu código acima faz a requisição do conteúdo da página de domínio diferente (no qual não tenho acesso), e assim exibe no meu domínio, por exemplo:
examplo.com.br/proxy.php?url=https://outrodominio.com.br. Mas suponhamos que o outro domínio https://outrodominio.com.br faça uma chamada para uma folha de estilo na url https://outrodominio.com.br/style.css então ainda vou ter problema com o Compartilhamento de Recursos de Origem Cruzada.
Queria saber como posso resolver isso? No entanto, já agradeço pela ajuda e referência.