2012-01-07 100 views
2

所以我知道这是一个常见的问题,并且看到很多人在讨论它,但是觉得我的情况是独特的,也许不是作为其他人参与其中。使用.ajax(JQuery)跨域问题到我自己的域 - 简单的PHP页面

我有一个主机网站,并尝试使用JQ和PhoneGap构建iPhone应用程序。

我希望人们能够将他们的分数从应用程序传递到我的主域,但我正在得到可怕的结果: “Access-Control-Allow-Origin不允许使用Origin null”。 当我尝试把这个:

$.ajax({ 
     type: "POST", 
     url: 'http://www.homesite.com/thephppage.php', 
     data: { 
      'guid': '12333-54', 
      'score': 52, 
      'initials': 'tod' 
     }, 
     success: function (data) { 
      try { 

       } 
       else { 

       } 
      } 
      catch (err) { 
       alert(err); 
      } 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    }); 

由于这是在呼唤我自己的域名,是有什么简单的我可以做纠正这个问题呢?

谢谢。 T

回答

0

工作!哦,光荣! (排序):这是我没有...

改用阿贾克斯的,我去了JSONP途径(在某种程度上),并新增了标签我的头动态像这样:

var head = document.getElementsByTagName('head')[0]; 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = 'http://thesite.co/thepage.php?var1=123&var2=432&var3='ttt'; 
    head.appendChild(script); 

我甚至没有给它一个CALLBACK方法,因为(因为我拥有目标网站,并知道它的到来)在我的PHP端,我用这样的方法名包装返回:

$ encoded = json_encode($ json) ; echo“testMethod(”。$ encoded。“)”; 除了我的DARN iPhone和iPad模拟器外,这个功能非常棒! (天哪,我需要购买真正的设备...)所以我仍然不知道这是否适用于实际的设备,但它现在在Chrome和Safari浏览器工作...让我希望我能弄清楚如何使它在该手机上工作!

感谢大家的帮助!

==========第二个更好的移动解决方案======================这比JSONP - 动态脚本解决方案更好...

在你的头下你的Phonegap和JQ调用插入这个标签。

<script type="text/javascript"> 
     $(document).bind("mobileinit", function() { 
      $.mobile.allowCrossDomainPages = true; 
     }); 
    </script> 

然后在您的Xcode资源文件夹中的文件Phonegap.plist,域加入到外部域...即。 phonegap.com。 (离开http或www)。

4

事实证明,您拥有这两个域并不会改变ajax请求不能跨域的事实。

由于这是呼叫到我自己的域,有没有简单的问题可以纠正这个问题?

看一看建立CORS,它应该让你做这些跨域请求。此外,根据该jQuery docs,jQuery的应支持CORS请求-大多

xhrFields(加入1.5.1)地图的fieldName-fieldValue方法对甲地图来设定 天然XHR对象上。例如,如果需要,您可以使用它将带有Credentials的 设置为true以用于跨域请求。

$ .ajax({url:a_cross_domain_url,xhrFields:{ withCredentials:true}});在jQuery 1.5中,withCredentials属性未传播到本地XHR,因此需要它的CORS请求会忽略此标志。为此,我们 建议使用jQuery 1.5.1+,如果您需要使用它。


目前,由于在Firefox的错误,其中.getAllResponseHeaders() 返回空字符串虽然.getResponseHeader(“内容 - 类型”) 返回一个非空字符串,自动进行解码不支持使用jQuery的Firefox JSON CORS响应 。

+0

好吧,所以不同的网站永远不会将变量传递给对方?我不认为这是不常见的。有什么我需要添加到我的服务器来允许这个吗?或者它是浏览器限制? – 2012-01-07 21:05:28

+0

@toddv - 处理此问题的最常见方法是使用代理。您可以在同一个域上对代理进行ajax调用,然后代理会将响应转发回去。 – 2012-01-07 21:06:40

+0

感谢您的帮助亚当,我真的很感激它......我只是困惑。我不明白我的应用程序中有一个页面调用另一个页面的区别,因此它可以完成与最初页面相同的操作。 (我知道......我完全错过了这里的一些东西)......我想试试看更多这方面的内容。 – 2012-01-07 21:15:17

2

为了避免调用从应用程序不同的域,你可以在你的主机的网站,将比分注册转发到你的家域做一个页面。然后,您可以在主机网站上调用此页面。

您可以使用PHP中使用HttpRequest::send

例如(不包括用户的身份验证)来转发数据:

$url = 'http://mydomain.com/score.php'; 
$r = new HttpRequest($url, HttpRequest::METH_GET); 
$r->addQueryData(array('initials' => $initials, 'score' => $score)); 

try { 
    $json = $r->send()->getBody(); 
    // output the response to forward it to the app 
    echo $json; 
} catch (HttpException $ex) { 
    // handle error 
} 
+0

那么我传递的用户名首字母,他们的分数和他们的appId到我的域...所以不知何故我必须从应用程序传递到域,对不对? – 2012-01-07 21:06:52

+0

从我所了解的你有一个网站A可以通过iPhone访问,并且在某个时候你想对另一个网站B进行Ajax呼叫来注册一个高分。不要打电话给B站点,你可以打电话给A站点,让A站点呼叫B站点。 – 2012-01-07 21:09:09

+0

不完全。我有应用程序A ...和一个按钮,显示'GET RANK!' ...推这个,我想打电话给我的网站B的PHP页面,发送他们的分数和首字母缩写到该页面(有点像mydomain.com/score.php?initials=tev&score=12345)...在PHP页面上,我插入他们的分数并发回JSON,告诉他们他们在所有球员中的排名。 – 2012-01-07 21:13:33