【问题标题】:php Origin is not allowed by Access-Control-Allow-OriginAccess-Control-Allow-Origin 不允许 php Origin
【发布时间】:2013-04-11 00:34:33
【问题描述】:

我的 ftp/php 跨域请求有问题。使用我的浏览器,我可以通过传递如下参数来访问内容:http://xxx.org/models/get.php?file=default_app/y_car_new/stock.jpg。但是对于 JavaScript,相同的链接给了我 Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin 我已经试过了

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

在下面的脚本中没有运气。我的 ftp 访问服务器中有一个 get.php 文件,代码如下:

<?

if(isset($_GET["file"])) {
    $filepath = "/.../models/".$_GET["file"];
    //echo "path: " , $filepath;
    $filetype = pathinfo($filepath);
    //echo $filetype['extension'], "\n";
    header('Access-Control-Allow-Origin: *');
    header('Content-Type: '.$filetype['extension']);
    // //header('Content-Type: application/octet-stream');
    header('Content-Length: ' . filesize($filepath));
    ob_clean();

    readfile($filepath);
}//if

else {
   echo '<img src="http://stupidbadmemes.files.wordpress.com/2013/02/no-you-may-not.jpg"></img>';
}


?>

我在这个脚本中做错了什么?

【问题讨论】:

  • 随响应一起发送跨域标头是毫无意义的。这就像通过将其写在存储在保险库中的票据上来授予访问银行保险库的权限。无法进入保险库,因为您没有可以进入的纸条,并且您无法拿到纸条,因为它被锁在里面。

标签: php ftp cross-domain


【解决方案1】:

如果您要来回发送 GET 数据,我会尝试更多地打开您的访问控制。同源规则可能非常挑剔。

Allow-Origin 管理哪些服务器可以发出请求。

Max-Age 实现过期。

Allow-Methods 允许请求者发送 GET/POST/等。数据给你。

这是一个例子:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');

旁注

Allow-Origin 应在生产中设置为您的特定请求域,* 会增加一些风险。

请仔细检查您的输入,访问这样的文件是一件有风险的事情。您实际上是让人们阅读您工作目录中的任何文件。

$filepath = "/.../models/".$_GET["file"];

【讨论】:

  • 我了解这些风险,但现在我只需要它工作.. 无论如何我尝试将它添加到脚本中,但它仍然不起作用
  • 系统上的任何文件,事实上,不仅仅是当前目录中的文件。考虑file=../../../../etc/passwd
  • 我认为你的答案已经开始起作用了......虽然我没有改变任何东西......我会继续测试更多并将你的答案标记为正确的
【解决方案2】:

这是一个客户端“问题”。这是一个安全问题,由浏览器实现以禁止从一个域到另一个域的请求。有一些方法可以解决这个问题,尤其是 JSONP。

【讨论】:

  • 我之前有这个工作,虽然我没有编写其他脚本。问题是我不小心删除了它,现在我正在尝试重写它..
  • 我需要返回的内容包括图片和XML。我可以使用 jsonP 来获取 xml 内容吗?
猜你喜欢
  • 2013-09-09
  • 2012-06-07
  • 2011-11-05
相关资源
最近更新 更多