Android/iOS WebView未遵循CORS HTTP重定向(30x)

CORS HTTP redirects (30x) not followed by Android / iOS WebView

本文关键字:重定向 HTTP 30x CORS iOS WebView Android      更新时间:2023-09-26

场景:

  • WebView(Android 4.x)通过http(而非file://)加载页面
  • 该页面包含对另一个域上的资源的xhr请求(本机或jQuery,结果相同)
  • 资源通过307(或任何其他30x,相同结果)重定向到另一个资源(某个域或非某个域,相同的结果)
  • 我得到了臭名昭著的"错误",以及任何其他信息

注意:

  • 如果不是重定向,则请求已满
  • 如果所有资源都在同一台服务器上,则请求已满
  • CORS头是为重定向的资源和最后一个资源设置的
  • 在Chrome或Firefox上,一切都能完美运行
  • 我可以控制一切(Android应用程序、服务器和网页)
  • "手动"重定向有效,如果我单击a元素,WebView将遵循307
  • WebView没有命中最终的URL,这(显然)意味着它在第一个响应中检测到错误
  • 我不使用BASE元素

JS代码基本上就是这个

var url = "http://xxxxxx/zot"; var oReq = new XMLHttpRequest(); oReq.onerror = function() { // I received the error }; oReq.onload = function(e) { // Not reached }; oReq.open("GET", url, true); oReq.send();

第一个请求吐出的标头:

HTTP/1.1 307 Temporary Redirect
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: connection,host,accept-language,accept-encoding,accept-charset,user-agent,origin,cache-control,pragma,referer,origin,X-Requested-With,x-requested-with,accept-charset,x-wap-profile,x-getzip, Access-Control-Allow-Origin,X-HTTP-Method-Override,Content-Type,Authorization,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS
Location: http://10.90.7.10:3030/r/vast
Date: Fri, 11 Apr 2014 09:40:01 GMT
Connection: keep-alive

(尝试删除所有、部分等)

我发现了问题。不幸的是,WebViews倾向于在每个请求中发送自定义标头,而这一事实将触发带有preflight类型请求的CORS。但我有一个重定向,标准明确禁止飞行前的请求(http://www.w3.org/TR/cors/#cross-原始请求-带反射灯-0,第3节)

如果响应的HTTP状态代码不在2xx范围内[则]应用网络错误步骤。

例如,我的XPeria T正在发送x-wap-profilex-getzip,但也发送x-requested-with