将Access-Control-Allow-Origin添加到PHP中的标头

时间:2012-09-27 21:53:33

标签: php curl http-headers cors

我正在尝试解决WebGL应用程序上的CORS限制问题。我有一个Web服务,它解析URL并返回图像。由于此Web服务未启用CORS,因此我无法将返回的图像用作纹理。

我打算:

  1. 编写PHP脚本来处理图像请求
  2. 图像请求将通过查询字符串作为url发送 参数
  3. PHP脚本将:

    1. 使用查询字符串url
    2. 调用Web服务
    3. 获取图像响应(Web服务返回内容类型:图像响应)
    4. 添加CORS标头(Add Access-Control-Allow-Origin) 响应
    5. 将回复发送到浏览器
    6. 我尝试使用各种技术实现这一点,包括CURL,HTTPResponse,plain var_dump等,但在每个技术的某些方面都被卡住了。

      所以我有两个问题:

      1. 方法是否足够好?
      2. 考虑到这种方法已经足够了:
      3. 我用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);
        

        但实际上并没有改变将响应内容类型设置为image / jpeg。它将标头+响应转储到内容类型text / html的新响应中,并在浏览器中显示标题和图像BLOB数据。

        如何让它以我想要的格式发送响应?

2 个答案:

答案 0 :(得分:15)

最简单的方法就是答案。只需在发送响应之前插入标题。

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

答案 1 :(得分:7)

确保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: *");