无法将jQuery POST请求跨域发送到PHP服务器

无法将jQuery POST请求跨域发送到PHP服务器,php,javascript,jquery,zend-framework,cors,Php,Javascript,Jquery,Zend Framework,Cors,我无法使用jQuery将POST请求从我的网站(前端)发送到我的PHP Zend服务器应用程序。它们作为单独的应用程序存在于我的服务器上,并配置为在两个不同的域上运行: 网站 网站服务器:8899 最奇怪的是,它在工作,我什么也没改变(我想!),现在它不工作了。。。所以我希望有人能帮忙 我正在使用以下JavaScript发出POST请求: var login = function(email, password) { var requestPath = serverPath + "

我无法使用jQuery将POST请求从我的网站(前端)发送到我的PHP Zend服务器应用程序。它们作为单独的应用程序存在于我的服务器上,并配置为在两个不同的域上运行:

  • 网站
  • 网站服务器:8899
最奇怪的是,它在工作,我什么也没改变(我想!),现在它不工作了。。。所以我希望有人能帮忙

我正在使用以下JavaScript发出POST请求:

var login = function(email, password) {

    var requestPath = serverPath + "/login";

    var params = {
        email       :       email,
        password    :       password
    };

    $.post(requestPath, params).done(function(response) {
        console.log(JSON.stringify(response));
        if(isResponseError(response)) {
            alert(response.opStatus + ': "' + response.opMessage + '"');
        } else {
            window.localStorage.setItem("zobyAuthData", JSON.stringify(response));
            if(window.localStorage.getItem("zobyAuthData") !== null) {
                window.location = 'home.php';
            }
        }
    }).error(function(request) { 
        console.log(JSON.stringify(request)); 
        alert(JSON.stringify(request));
    });

};
我在Zend服务器上使用以下代码在公共目录中的index.php文件中启用CORS:

function EnableCors() {

    // 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);
    }

    echo "You have CORS!";
}
当我尝试发出POST请求时,我还检查了Apache access_日志和error_日志文件,并将以下行写入access_日志:

127.0.0.1---[29/Jul/2013:12:00:37+0100]“选项/登录HTTP/1.1”200-

127.0.0.1--[29/Jul/2013:12:01:04+0100]“POST/HTTP/1.1”200 6611

错误日志有:

[Mon Jul 29 11:47:36 2013][error][client 127.0.0.1]PHP通知:未定义索引:第35行/Library/WebServer/Documents/Site/WebsiteServer/application/controllers/LoginController.PHP中的电子邮件,参考:

[Mon Jul 29 11:47:36 2013][error][client 127.0.0.1]PHP通知:未定义索引:第36行/Library/WebServer/Documents/Site/WebsiteServer/application/controllers/LoginController.PHP中的密码,请参考:

在客户端上,jQuery属于.error(request)函数,并在警报中显示以下内容:

{“readyState”:0,“responseText”:“status”:0,“statusText”:“error”}

是的,这不起作用! 您在这里违反了同一原产地政策。 为了实现这一点,您必须在请求中使用CORS头。 CORS是HTML5的一个特性,它允许XHR请求的跨源请求

只需访问这些伟大的网站,就可以了解该主题的介绍: 或

编辑: 为了调试,请设置以下标题

Header set Access-Control-Allow-Origin *
Header set Access-Control-Allow-Headers "content-type"
这应该允许任何页面。另外,不要忘记“访问控制允许标头”字段


也可以使用FF和Chrome进行调试。在同一个问题上,两者给出了不同的错误。根据问题的类型,一个或另一个将提供更多信息

嗨,谢谢你的评论。你能解释一下为什么选项和POST请求返回状态为200,如果这违反了同一原产地政策?这是我不明白的。另外,我如何修改我的请求以发送正确的标题?服务器已经向客户端发送了正确的头(我相信这就是为什么选项请求返回200状态的原因。如果服务器上的EnableCors函数被注释掉,则访问日志不会显示选项行项目。