PHP 标头不适用于 Access-Control-Allow-Origin

Posted

技术标签:

【中文标题】PHP 标头不适用于 Access-Control-Allow-Origin【英文标题】:PHP header not working for Access-Control-Allow-Origin 【发布时间】:2013-08-30 09:48:29 【问题描述】:

我正在使用jQuery File Upload plugin by Blueimp 将图像上传到服务器。问题是,发送服务器是admin.example.com,而存储图像的接收服务器是www.example.com。同一个域,不同的子域。

我关注了instructions here on setting up cross-domain uploads,就代码而言,一切似乎都是正确的,但是当我尝试上传图片时,我收到了这个错误:

XMLHttpRequest cannot load http://www.example.com/upload/. Origin http://admin.example.com is not allowed by Access-Control-Allow-Origin.

上传文件夹确实有读写权限。

我将在下面发布我的代码 - 如果有人可以告诉我如何解决这个问题,请告诉我。我之前曾问过这个问题,并打算尝试其他一些解决方案(iframe 上传和 ftp 文件移动)。这些都不是最适合我的情况,如果我能这样做,那将是最简单的......

接收服务器

index.php

<?php
    header('Access-Control-Allow-Origin: http://admin.example.com');  //I have also tried the * wildcard and get the same response
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
?>
<?php

    error_reporting(E_ALL | E_STRICT);
    require('UploadHandler.php');
    $upload_handler = new UploadHandler();

发送服务器

main.js

$(function () 
    'use strict';

    // Initialize the jQuery File Upload widget:
    $('#fileupload').fileupload(
        // Uncomment the following to send cross-domain cookies:
        xhrFields: withCredentials: true,
        url: 'http://admin.example.com/upload/',
        disableImageResize: false,
        dropZone: $('#dropzone'),
        imageMaxWidth: 1800,
        imageMaxHeight: 1800,
    );
);

我再次尝试了 iframe 文件上传,所以请不要建议它,除非你能给我完整的工作代码......

我也尝试过header('Access-Control-Allow-Origin: *');,但遇到了同样的错误...我正在努力在周末之前完成这项工作,因此我将不胜感激。 :)

谢谢!

编辑:这是失败的 OPTIONS 请求的响应标头

Allow:OPTIONS, TRACE, GET, HEAD, POST
Content-Length:0
Date:Tue, 27 Aug 2013 15:08:29 GMT
Public:OPTIONS, TRACE, GET, HEAD, POST
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET

【问题讨论】:

查看您的浏览器发出的请求。它将首先执行一个 OPTIONS 请求(不是 GET 或 POST)。检查您的服务器是否回复了正确的标头。 real 请求实际上并不需要 CORS 标头。 看来他正在处理 OPTIONS @FritsvanCampen 在上面看到我的编辑,看不到任何 Access-Control-Allow-Origin... 好吧,我没有看到 CORS 标头,所以请确保您的脚本被 OPTIONS 请求调用。 @FritsvanCampen 所以我需要在标题中添加Access-Control-Allow-Headers??? 【参考方案1】:

我的解决方案是使用 UTF-8 编码重新保存 PHP 文件。显然,使用的原始文本文件(我复制到位并覆盖以进行快速测试)使用了其他一些时髦的编码。

【讨论】:

【参考方案2】:

我会尝试在 web.config 上进行设置,因为您在 IIS 服务器上运行:

https://gist.github.com/corydeppen/3518666

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <!-- allowing all-->
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

【讨论】:

【参考方案3】:

我使用这个标题及其为我工作

header('content-type: application/json; charset=utf-8');
header("access-control-allow-origin: *");

【讨论】:

在 index.php 文件上? 是的。另外,尽量放在“require('UploadHandler.php');”之后 别忘了重启服务器 试过了,还是不行……我想我还是坚持FTP上传吧。我对web.config 文件还有另一个问题,也许你可以帮忙? (***.com/q/18489657/636848) 对我也不起作用,我仍然收到错误消息:XMLHttpRequest cannot load example.com。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'localhost'。

以上是关于PHP 标头不适用于 Access-Control-Allow-Origin的主要内容,如果未能解决你的问题,请参考以下文章

PHP 标头不适用于 Access-Control-Allow-Origin

标头位置不适用于实时服务器,但适用于 localhost

使用cors包和设置Access-Control标头都没有运气

尽管我的服务器启用了标头,但 AJAX CORS 请求失败 - (Access-Control*)

如果我使用 header() 函数,登录索引表单不适用于 login.php

即使存在标头,CORS 也会失败