【问题标题】:Add Access-Control-Allow-Origin to header in PHP将 Access-Control-Allow-Origin 添加到 PHP 中的标头
【发布时间】:2012-09-19 18:46:52
【问题描述】:

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

我打算:

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

PHP 脚本将:

  1. 使用查询字符串 url 调用 Web 服务
  2. 获取图像响应(Web 服务返回 content-type:image 响应)
  3. 将 CORS 标头 (Add Access-Control-Allow-Origin) 添加到 回应
  4. 向浏览器发送响应

我尝试使用包括 CURL、HTTPResponse、plain var_dump 等在内的各种技术来实现这一点,但在每种技术中都卡住了。

所以我有两个问题:

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

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

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

【问题讨论】:

  • curl_exec(), ($headers = curl_getinfo($ch); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);) 后面的 cURL 代码不是不需要吗?

标签: php curl http-headers cors


【解决方案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: *");
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 2011-06-27
      • 2016-07-03
      • 1970-01-01
      • 2016-01-11
      • 2023-01-13
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多