在PhoneGap + jQuery Mobile中使用ajax的CORS不在设备上工作,但在浏览器上

所以我正在使用Phone Gap和jQuery mobile构建一个应用程序。

当使用ajax从白名单服务器获取json响应时,我收到错误响应。 但是在控制台中没有显示任何内容。 奇怪的是,当在网络浏览器中测试应用程序时,它运行正常,只有当我启动到我的iphone设备时它才会抛出一个条带。

现在值得一提的是,我正在托管我的PHP脚本的网站是在Phone Gap中列出的白色。 我在数组中使用*(以防这有所不同)。 我为此制定了一个jsonp解决方法,但不想使用它 – 我觉得如果它在浏览器中工作,它必须在设备上。 我希望这是一个简单的解决方案……

这是我简单的PHP脚本,只是回显一个json字符串。

 1, 'b' => 2); echo json_encode($arr); ?> 

这是JS

  $('#registerUser').submit(function() { $.ajax({ url: 'http://www.mydomain.co.uk/path/register/add_user.php', type: 'post', dataType: 'json', crossDomain : true, timeout: 5000, success: function(msg){ alert(msg.a); }, error: function(){ alert('There was an error loading the data.'); } }); }); }); 

编辑:我在页面上也有这个js …建议在jquery mobile docs上使用Phone Gap时使用它

   $( document ).on( "mobileinit", function() { $.mobile.allowCrossDomainPages = true; $.support.cors = true; });  

forms – 我不认为这是必要的……

  

我在这里先向您的帮助表示感谢!

最简单的尝试是使用以下内容扩充PHP服务器:

  1, 'b' => 2); echo json_encode($arr); ?> 

您还需要确保您的PHP服务器允许OPTIONS HTTP请求。

答案越长,JS代码中的dataType: 'json'就会触发CORS预检请求。 预检请求基本上要求服务器提供实际请求的许可。 您可以在此处了解有关CORS预检的更多信息: http : //www.html5rocks.com/en/tutorials/cors/

我遇到过客户端实际忽略了Access-Control-Allow-Origin: *的情况。 我认为通过CORS允许所有域的“正确”方式(参见w3c规范确认这一点 )实际上是从请求头中获取源域,然后将该源动态地应用于Access-Control-Allow-Origin头。响应,而不是使用通配符,以确保客户端将尊重标头。

好的,事实certificate代码没有问题。 似乎应用程序正在缓存错误结果或其他东西。 我杀了应用程序并重新启动它,现在一切正常。 通过阅读它似乎iOS6 safari缓存POST,这与以前的版本不同。

我在我的ajax调用中添加了这个以防止缓存POST。

  headers: { "cache-control": "no-cache" } 

我希望这可以帮助别人,因为它一直很痛苦!

谢谢你的回复

我对此问题的体validation明是由于我使用带有“无效”SSL证书的httpS这一事实。 iPhone移动safari和webview不信任SSL证书,因此没有提出AJAX请求。

我可以暂时使用普通的HTTP来完成开发。

我的CORS标题是:

 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: X-Requested-With,Authorization