web-dev-qa-db-fra.com

Ajoutez Access-Control-Allow-Origin à l'en-tête dans PHP

J'essaie de contourner la restriction CORS sur une application WebGL. J'ai un service Web qui résout l'URL et renvoie des images. Étant donné que ce service Web n'est pas compatible avec CORS, je ne peux pas utiliser les images renvoyées comme textures.

J'avais l'intention de:

  1. Écrire un script PHP pour gérer les requêtes d'images
  2. Les demandes d'images seraient envoyées via la chaîne de requête en tant que paramètre d'URL

Le script PHP:

  1. Appelez le service Web avec l'url de la chaîne de requête
  2. Récupérer la réponse d'image (le service Web renvoie un type de contenu: réponse d'image)
  3. Ajoutez l'en-tête CORS (Add Access-Control-Allow-Origin) à la réponse
  4. Envoyez la réponse au navigateur

J'ai essayé de l'implémenter en utilisant une variété de techniques, y compris CURL, HTTPResponse, plain var_dump etc., mais je suis resté bloqué à un moment donné dans chacune.

J'ai donc 2 questions:

  1. L'approche est-elle assez bonne?
  2. Considérant que l'approche est assez bonne:

J'ai fait le plus de progrès avec CURL. Je pourrais obtenir l'en-tête de l'image et les données avec:

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

Mais cela ne change en fait pas de définir le type de contenu de la réponse sur image/jpeg. Il vide l'en-tête + la réponse dans une nouvelle réponse de type texte/html et affiche l'en-tête et les données BLOB de l'image dans le navigateur.

Comment puis-je lui envoyer la réponse dans le format que je souhaite?

14
SANDeveloper

L'approche la plus simple s'est avérée être la réponse. Juste eu à insérer l'en-tête avant d'envoyer la réponse.

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

assurez-vous qu'Apache (si vous utilisez Apache) a mod_headers chargé avant d'utiliser tout cela avec des en-têtes.

(les conseils suivants fonctionnent sur Ubuntu, je ne connais pas les autres distributions)

vous pouvez vérifier la liste des modules chargés avec

Apache2ctl -M

pour activer les mod_headers, vous pouvez utiliser

a2enmod headers

bien sûr, après tout changement dans Apache, vous devez le redémarrer:

/etc/init.d/Apache2 restart

après cela, essayez d'ajouter cette ligne à votre .htaccess, ou bien sûr, utilisez des en-têtes php

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

PHP:

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