Ajax Can';t在启用CORS的情况下,从我的请求头检索我的x-api-key。为什么?

Ajax Can';t在启用CORS的情况下,从我的请求头检索我的x-api-key。为什么?,ajax,apache,api,codeigniter,cors,Ajax,Apache,Api,Codeigniter,Cors,我正在使用CodeIgniter2RESTAPI和AJAX从带有PhoneGap的智能手机向带有apache的AWS服务器发出请求 在使用我的本地主机/浏览器时,一切正常。 但当试图建立一个远程服务器时,情况变得糟糕 我已使用CORS正确配置服务器,以便允许外部请求,如下所述: 为了保护API的安全,我已经设置了一个API密钥,我必须在请求头中传递该密钥,如下所示: $.ajax({ type:"GET", url: server_url + 'user

我正在使用CodeIgniter2RESTAPI和AJAX从带有PhoneGap的智能手机向带有apache的AWS服务器发出请求

在使用我的本地主机/浏览器时,一切正常。 但当试图建立一个远程服务器时,情况变得糟糕

我已使用CORS正确配置服务器,以便允许外部请求,如下所述:

为了保护API的安全,我已经设置了一个API密钥,我必须在请求头中传递该密钥,如下所示:

    $.ajax({
        type:"GET",
        url: server_url + 'user/available',
        headers: { 'X-API-KEY': key },
        dataType: 'json'
    });
但是,在看到我的ajax调用因为API密钥无效而被拒绝之后,我一直在努力确保服务器收到了密钥。但事实并非如此。当我尝试回显我的钥匙时,它是空的

我可以在调试控制台中看到以下内容:

访问控制允许标头不允许请求标头字段X-API-KEY

因此,我一直在修改我的.htaccess,如下所示:

所以现在,信息消失了,但问题仍然是一样的。。。为什么?

如何通过AJAX调用头传输这个X-API-KEY,以便对用户进行身份验证


非常感谢

我遇到了这个问题,经过几周的调整,我终于可以用一份简单的工作让它工作了。。。我记不起修复它的确切部分,但将提供我目前使用的

服务器端

function __construct(){
    parent::__construct();
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
    header("Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
      header("Access-Control-Allow-Headers: X-API-KEY");
    }

function available_options(){
    $this->response(array('response' => array()), 200);
}
function sendData(dataToSend, successCallback) {
    window.default_headers['X-API-KEY'] = '_KEY_';
    return  $.ajax({
        type: "POST",
        url: server_url + 'user/available',
        data: { data : JSON.stringify(dataToSend) }, // serializes the form's elements.
        dataType: 'json',
        headers: window.default_headers,
        xhrFields: {
            withCredentials: true
        }
    });
}
客户端

function __construct(){
    parent::__construct();
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
    header("Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
      header("Access-Control-Allow-Headers: X-API-KEY");
    }

function available_options(){
    $this->response(array('response' => array()), 200);
}
function sendData(dataToSend, successCallback) {
    window.default_headers['X-API-KEY'] = '_KEY_';
    return  $.ajax({
        type: "POST",
        url: server_url + 'user/available',
        data: { data : JSON.stringify(dataToSend) }, // serializes the form's elements.
        dataType: 'json',
        headers: window.default_headers,
        xhrFields: {
            withCredentials: true
        }
    });
}
因为您使用的是GET请求,所以可能使用
JSONP
会更有用,这样可以避免跨域请求

JSONP请求

$.ajax({
     type : "GET",
     dataType : "jsonp",
     url: server_url + "user/available?callback=?", // ?callback=?
     success: function(data){
           // do stuff with data
     }
});

谢谢,这绝对是一个很好的答案!我发现在使用智能手机解决我的问题时,您不需要CORS来进行跨域ajax调用。但我肯定会在不久的将来使用你的解决方案:)你把它变成了phonegap应用程序还是什么?我仍在努力解决在Androids上运行本地文件的问题是的,使用phonegap(或一般的移动应用程序),您不需要使用Cors或jsonp或任何东西来执行跨域请求。只需使用json即可实现,无需特殊配置。就像您在使用localhost一样。。Simlu更改服务器url。它起作用了!我花了2分钟的时间来删除标题和处理跨浏览器ajax调用的麻烦,因为只有浏览器需要一些特定的配置来完成这项工作,出于安全原因,这显然不适用于移动应用程序。