来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面
Posted
技术标签:
【中文标题】来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面【英文标题】:403 Forbidden response from jQuery.ajax request with PhoneGap Desktop 【发布时间】:2016-02-22 22:41:29 【问题描述】:我设置了一个 PhoneGap 项目并通过 PhoneGap 桌面启动它。 在这个项目中,我调用了以下 jQuery 方法:
$.ajax(
type: 'GET',
url: 'http://api.fixer.io/latest',
dataType: 'json',
success: function(data)
exchangeRates = data;
displayData(exchangeRates);
)
一旦我使用按钮触发它,我会收到 403“禁止”响应。 请求的网址是:http://192.168.178.40:3000/proxy/http://api.fixer.io/latest
这是PhoneGap Desktop加载应用程序和代理的本地Serveradress(192.168.178.40:3000),这似乎也来自PhoneGap。 发送的请求头是这样的:
Host: 192.168.178.40:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.178.40:3000/
Cookie: connect.sid=s%3AhoA3oe0JbAdmGQ4Z6bYlRuFa.oDM1qjeHCadzwfSmYy%2BFabG0b22OH0ZqRgVuLMlcCL8
Connection: keep-alive
响应头如下:
Connection: close
Content-Type: text/plain
Date: Fri, 20 Nov 2015 12:07:23 GMT
Server: nginx/1.4.6 (Ubuntu)
Status: 403 Forbidden
Transfer-Encoding: chunked
当我尝试打开请求的 URL 时,它会提供我想要的 JSON。
为什么我会得到 403?有人可以帮忙吗?
[成功后编辑] 好吧,好像我在我设置的 PhoneGap 项目中遇到了问题,因为 Simon Pricketts 的建议似乎是正确的。 所以我建立了一个全新的项目。这次是没有 PhoneGap 覆盖的直接 Cordova 5.4.0 项目。然后我再次尝试了 Simons 的建议,瞧 ---> 这次成功了!
结论:PhoneGap 项目的 config.xml 与 Content-Security-Policy 结合导致 App 出现故障,导致 403 错误。由于我对 PhoneGap 不太熟悉,所以我尝试了直接使用 Cordova,效果很好。
【问题讨论】:
它提供了我想要的 JSON,但是如果你看到控制台,你可以找到实际的问题。一种解决方案是使用填充手段jsonp
响应 json 以进行跨域数据共享。
【参考方案1】:
如果使用 Cordova 5,您可能需要设置 Content Security Policy 元标记,如果使用 ios9 或将来将应用程序迁移到 iOS 时,还需要另外配置 App Transport Security。
我有一篇博客文章演示了如何执行此操作,并且实际上还使用了您尝试使用的相同数据源 - 您可以阅读此 here。
如果这是您的问题,您的 index.html 中需要这样的内容:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://api.fixer.io">
注意:connect-src 子句指定访问http://api.fixer.io
【讨论】:
除了<access origin="*"/>
或项目 config.xml 中的类似内容外,还需要此文件
这似乎是一个不错的选择。我尝试了(明确的)白名单建议,但这似乎不是漏洞答案。现在我看看你的回答是否对我有帮助。到目前为止,谢谢。【参考方案2】:
您很可能没有whitelisted 您尝试访问的域。如this question 中所述,在连接到“外部”域之前,您需要将其列入白名单。
只是为了让我们在这里也有答案:您需要将其添加到您的配置文件中:
<access origin="*" />
【讨论】:
其实我的 config.xml 中已经有了这个。还是不行。我会尝试明确的白名单。 感谢您的建议,到目前为止没有帮助。【参考方案3】:在 Post Cordova 5 中,我认为您需要将白名单作为插件包含在 config.xml 文件中,如下所示:
<access origin="http://*.phonegap.com" subdomains="true" />
<access origin="*://*.api.fixer.io/*" subdomains="true" />
<plugin name="cordova-plugin-whitelist" />
如果您想从外部源或 ajax 调用将外部文件包含到窗口中,您需要以这种方式包含插件
【讨论】:
以上是关于来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面的主要内容,如果未能解决你的问题,请参考以下文章
axios post请求和JQuery $ .ajax请求都是在移动设备上返回403禁止错误
如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应