Добавить Access-Control-Allow-Origin в заголовок в PHP

Я пытаюсь обойти ограничение CORS в приложении WebGL. У меня есть веб-служба, которая разрешает URL-адрес и возвращает изображения. Поскольку этот веб-сервис не включен CORS, я не могу использовать возвращенные изображения в качестве текстур.

Я планировал:

  1. Напишите PHP-скрипт для обработки запросов изображений
  2. Запросы изображений будут отправляться через строку запроса в качестве параметра url

Сценарий PHP:

  1. Вызовите веб-службу с помощью строки запроса
  2. Получение ответа на изображение (веб-служба возвращает ответ типа содержимого: изображение)
  3. Добавьте заголовок CORS (Добавить Access-Control-Allow-Origin) в ответ
  4. Отправить ответ в браузер

Я попытался реализовать это, используя различные методы, включая CURL, HTTPResponse, простой var_dump и т. Д., Но застрял в какой-то момент в каждом.

Итак, у меня есть 2 вопроса:

  1. Достаточно ли подходит этот подход?
  2. Учитывая, что подход достаточно хорош:

Я добился наибольшего прогресса в CURL. Я мог бы получить заголовок и данные изображения с помощью:

$ch = curl_init(); $url = $_GET["url"]; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:image/jpeg')); //Execute request $response = curl_exec($ch); //get the default response headers $headers = curl_getinfo($ch); //close connection curl_close($ch); 

Но на самом деле это не меняет настройки типа содержимого ответа на изображение / jpeg. Он удаляет ответ заголовка + в новый ответ типа text / html типа контента и отображает заголовок и данные BLOB изображения в браузере.

Как мне получить его для отправки ответа в формате, который я хочу?

Удалось заставить его работать:

  $ch = curl_init(); $url = $_GET["url"]; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); //Execute request $response = curl_exec($ch); //get the default response headers $headers = curl_getinfo($ch); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); header('Content-Type: image/jpeg'); header("Access-Control-Allow-Origin: *"); // header("Expires: Sat, 26 Jul 2017 05:00:00 GMT"); //close connection curl_close($ch); flush(); 

Ответ оказался самым простым. Просто нужно было вставить заголовок перед отправкой ответа.

  $ch = curl_init(); $url = $_GET["url"]; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); //Execute request $response = curl_exec($ch); //get the default response headers header('Content-Type: image/jpeg'); header("Access-Control-Allow-Origin: *"); //close connection curl_close($ch); flush(); 

убедитесь, что Apache (если вы используете Apache) загружен mod_headers, прежде чем использовать все это с заголовками.

(следующие советы работают над Ubuntu, не знают о других дистрибутивах)

вы можете проверить список загруженных модулей с помощью

 apache2ctl -M 

для включения mod_headers вы можете использовать

 a2enmod headers 

конечно, после любых изменений в Apache вы должны перезапустить его:

 /etc/init.d/apache2 restart 

после этого попробуйте добавить эту строку в ваш .htaccess или, конечно же, использовать заголовки php

 <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> 

PHP:

 header("Access-Control-Allow-Origin: *");