PHP头文件中的Access-Control-Allow-Origin无法工作

14

我正在使用Blueimp的jQuery文件上传插件将图片上传到服务器。问题是,发送服务器是admin.example.com,而接收图像存储的服务器位于www.example.com。同一域名,不同子域。

我按照在设置跨域上传方面的指示进行操作,就代码而言,一切似乎都正确,但当我尝试上传图片时,出现了以下错误:

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

1
查看你的浏览器发出的请求。它首先会执行一个OPTIONS请求(而不是GET或POST)。检查你的服务器是否正确回复了这些头部信息。实际的请求实际上并不需要CORS头部信息。 - Halcyon
似乎他正在处理 OPTIONS。 - mplungjan
@FritsvanCampen,请看我上面的编辑,没有找到Access-Control-Allow-Origin的任何内容... - Caleb
好的,我没有看到CORS头文件,所以请确保您的脚本被调用来处理“OPTIONS”请求。 - Halcyon
@FritsvanCampen 那么IIS服务器上需要做些什么吗?我刚刚获得了服务器的管理访问权限,所以我还在适应中,但我可以联系IT人员。 - Caleb
显示剩余6条评论
3个回答

26

我使用这些标头,它对我很有效

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

在index.php文件上? - Caleb
是的。此外,请尝试在“require('UploadHandler.php');”后面放置。 - Aitem
请重新启动服务器。 - Aitem
尝试过了,还是不行...我想我只能坚持使用FTP上传了。我有一个关于web.config文件的问题,也许你可以帮忙解决一下?(http://stackoverflow.com/q/18489657/636848) - Caleb
对我也不起作用,我仍然收到错误消息:XMLHttpRequest无法加载http://example.com。请求的资源上没有“Access-Control-Allow-Origin”标头。因此,源“http://localhost”不允许访问。 - Curtis
显示剩余2条评论

1
我会尝试在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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接