Подтвердить что ты не робот

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

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

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

  • Напишите PHP script для обработки запросов изображений
  • Запросы изображений будут отправляться через строку запроса в виде URL-адреса Параметр

PHP скрипт будет:

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

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

У меня есть 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();
4b9b3361

Ответ 1

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

    $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();

Ответ 2

убедитесь, что 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: *");