使用 jQuery Ajax 和 PHP 的 CORS 请求

Posted

技术标签:

【中文标题】使用 jQuery Ajax 和 PHP 的 CORS 请求【英文标题】:CORS Request with jQuery Ajax & PHP 【发布时间】:2014-09-13 21:13:15 【问题描述】:

我已经尝试了很多次来让这个工作,但似乎无法维持生计。

当我第一次实现这个时,它可以完美地处理一些请求,然后突然出现。它停止工作。

这是我从油脂/篡改猴子脚本运行的代码:

$.ajax(
    url: 'ServerLinkHere',
    crossDomain: true,
    data: 
        artist: artist,
        track: title,
        link: data.url
    ,
    type: 'POST',
    success: function (resp) 
        console.log(resp.responseText);
    
);

这是我的服务器端脚本(来自用户 Ganesh 在另一个线程中感谢):

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) 
    header("Access-Control-Allow-Origin: $_SERVER['HTTP_ORIGIN']");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day


// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']");

    exit(0);

在代码之后,我进行计算:下载一个文件,然后返回一个指向文件下载的链接作为正文。

目前,似乎正在运行计算,因为该文件确实出现在文件系统上。

但是,当它返回一个链接时,chrome 浏览器仍然会抛出访问控制错误。这是调试图(不能直接附上,不代表):

但是,我还将代理连接到 CharlesProxy 调试器,调试器显示一切正常。这是响应的图片:

这可能是预检问题吗?我没有发送OPTIONS

【问题讨论】:

你的答案在这里:***.com/questions/20442628/cors-jquery-ajax-request 我已经正确设置了标题。它仍然不起作用。为了让您免于怀疑,我重新创建了相同的请求/响应解决方案,但它仍然返回相同的错误。 XMLHttpRequest 无法加载 xxxx。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'hypem.com' 不允许访问。我使用的是greasemonkey脚本,所以起源来自炒作 这个新信息很有趣。看起来问题完全出在服务器端。不知何故,标题未按您的意愿设置。您应该在检查工具 (firebug) 中找到一个选项卡,其中显示了响应标头。它们符合您的预期吗? 另外,避免将任何东西放入输出缓冲区。即使是空白也会妨碍您设置标题。一个典型的 php 错误是在设置标头之前在某个地方没有注意到空白。 【参考方案1】:

尝试注释掉您的服务器端脚本(只是回显一些虚拟字符串以进行调试),然后将其添加到您的 htaccess:

SetEnvIf Origin ^(.*)$ ORIGIN_DOMAIN=$0
<Files "*">
  Header add Access-Control-Allow-Origin %ORIGIN_DOMAINe
  Header add Access-Control-Allow-Methods "GET, POST, OPTIONS"
  Header add Access-Control-Allow-Headers "Authorization, X-Requested-With, Content-Type, Origin, Accept"
  Header add Access-Control-Allow-Credentials "true"
</Files>

【讨论】:

我编辑了文件以仅输出一个 html hi 并注释掉其余代码。我的 .htaccess 文件已被编辑,因此它反映了您的。从 jsfiddle 请求时仍然不起作用 除了通常的 xmlhttprequest 无法加载之外,没有其他错误...... Chrome 控制台中没有访问控制 bla bla bla。我注意到的一件奇怪的事情是,调试我的问题的人重新创建了他的请求,并且当我访问该页面时它对他有用。它没有用。这可能是客户端问题吗? 如果有人想知道,我把它放在我的服务器端 .htaccess 中,在那里我收到了 CORS Request denied 错误并修复了它。

以上是关于使用 jQuery Ajax 和 PHP 的 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的ajax方法:

如何使用 php jquery ajax 上传文件和插入数据

如何使用带有 json 和 php 的 jquery 的 $.ajax 函数上传文件

使用Jquery.AJAX方法和PHP后台数据交互小结

使用 jQuery 和 AJAX 的跨域 PHP 调用

使用 ajax、jquery 和 PHP 从数据库更新图像不起作用