2012-11-28 32 views
4

我有2个域(域A,域B)。Zend Framework 2 - AJAX来自其他服务器的请求

在域A置于ZF2应用程序,一切正常。

在域B上放置着陆页(小型站点用表单收集数据)。

来自着陆页我希望将表单数据发送到域A(AJAX请求)上的应用程序。

域A上的不幸ZF2应用程序未收到数据,也未显示结果。 当我从ZF2应用程序所在的同一个域发出AJAX请求时,一切正常。

我试图使用JSONP但没有成功。

我没有任何其他线索如何迫使这个工作。

回答

7

正如Bodgan的回答所述,这是浏览器安全问题,而不是ZF2问题。解决此问题的一种常用方法是更改​​域A的ACCESS-CONTROL-ALLOW-ORIGIN以允许来自域B的请求。此解决方案和其他解决方案在Mozilla开发人员网络(MDN)页面上讨论,用于HTTP access control (CORS)

基本上,您需要向接收服务器(域A)指出可以响应资源请求。您可以在位于域A的Web根目录下的.htaccess文件中执行此操作。以下是一些简单的示例代码,指示域A应该响应来自所有域的资源共享请求:*。 MDN上面链接的文章对“跨源资源共享(CORS)”进行了更深入的讨论。请记住,存在安全隐患,并且在大多数情况下,您不希望打开服务器以处理来自*原点的请求,而是打开由您自己控制的特定主机。

Options +FollowSymlinks 
RewriteEngine on 

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" 
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 
+1

这也可以在php中使用header()函数来完成,如下所示:'header('Access-Control-Allow-Origin:*');',但是请记住它必须在任何输出发送到浏览器。另请参见:http://enable-cors.org/和http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains – David

0

你可以改变你的htaccess文件支持,但最简单的方法是使用的响应类:如果您正在使用JSON作为结束点的数据源

$this->_response->setHeader('Access-Control-Allow-Origin', '*'); 

http://framework.zend.com/manual/2.0/en/modules/zend.http.response.html

,与json帮手一起使用这将设置您的编码头和其他一些东西

$this->_helper->json->sendJson($jsonIsite); 

http://framework.zend.com/manual/2.0/en/modules/zend.json.introduction.html

https://github.com/zf-fr/zfr-cors先进的CORS与ZF2,但上面的应该只是罚款一个简单的JSON端点。

+1

在我的例子我使用了一个通配符CORS * - 确保你做了你的研究,并使用适当的域来保证安全 – dmo