2013-07-29 197 views
0

我无法使用jQuery从我的网站(前端)向我的PHP Zend Server应用发送POST请求。他们的存在,我的服务器上单独的应用程序和配置为在两个不同的领域:无法将jQuery POST请求跨域发送到PHP服务器

  • site.website
  • site.server: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!"; 
} 

我还检查了Apache的access_log和error_log中文件时,我试图使POST请求,并以下线被写入ACCESS_LOG:

127.0.0.1 - - [29 /月/ 2013:12:00:37 0100] “OPTIONS /登录HTTP/1.1” 200 -

127.0.0.1 - - [29 /月/ 2013: 12时01分04秒0100] “POST/HTTP/1.1” 200 6611

而error_log中具有:

[周一年07月29 11时47分36秒2013] [错误] [客户端127.0.0.1 ] PHP注意:未定义索引:电子邮件地址/Library/WebServer/Documents/Site/WebsiteServer/application/controllers/LoginController.php on line 35,referer:http://site.website/

[Mon Jul 29 11:47:36 2013] [error] [client 127.0.0.1] PHP注意:Undefined index:password in /Library/WebServer/Documents/Site/WebsiteServer/application/controllers/LoginController.php在线路36上,引用者:http://site.website/

在客户端,jQuery的落入.error(请求)功能和以下被显示在警报:

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

回答

0

是的,这是行不通的! 您在这里违反了相同的来源政策。 为了达到这个目的,你必须在你的请求中使用CORS Headers。 CORS是一个HTML5特性,它允许XHR请求的跨源请求。

只需访问这些伟大的网站获得有关该主题的介绍: http://www.html5rocks.com/en/tutorials/cors/https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

编辑: 为了调试设置以下头

Header set Access-Control-Allow-Origin * 
Header set Access-Control-Allow-Headers "content-type" 

这应该允许任何页面。另外,请不要忘记“访问控制允许标题”字段。

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

+0

嗨,感谢您的评论。您能否解释为什么OPTIONS和POST请求返回200的状态,那么如果这违反了同一个来源策略?这是我不明白的。另外,我如何修改我的请求以发送正确的标题? 服务器已经向客户端发送了正确的头文件(我相信这是选项请求返回200状态的原因,如果EnableCors功能在服务器上被注释掉了,access_log不会显示OPTIONS行项目 –

+0

请参阅编辑的响应以上... – user619