【发布时间】:2017-04-19 08:11:03
【问题描述】:
我们有一个 React 应用程序,它从另一个域异步加载一些数据。这些请求是在cors 模式下使用isomorphic-fetch 发出的,并且在使用我自己的浏览器进行测试时,请求和响应看起来都很好并且工作正常。
我们监控响应并将失败记录回我们的应用程序以供分析。
虽然大部分时间一切都很好(一切似乎都被正确编入索引并且在 Google 中显示良好)我们仍然看到很多失败,仅对于 Googlebot,它未能正确获取数据。调试响应对象我看到status 是200,但statusText 是空的。响应没有正文(因此没有.json 或.text 方法),也没有标头(不应该是这种情况),并且模式正确设置为cors(不是opaque,这可以解释其他一些奇怪的东西)。
根据我对 CORS 的理解,就发送和接收的标头而言,这一切看起来都是光明正大的,那么为什么 Googlebot 会有这么多间歇性问题呢? Googlebot 说它有一个 HTTP 200 响应(成功,Promise 没有被拒绝),但它缺少 HTTP 200 响应带来的所有东西——它没有正文,也没有暴露标题。为什么 Googlebot 无法返回带有标题和正文的响应(如下所述)?
正常的预检请求如下所示(来自 Chome devtools)(在*/\* 中添加了额外的斜线以阻止 SO 认为它是评论开启器)
Accept:*/\*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:content-type, x-apikey
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:my.host.net
Origin:http://my.origin.net
Pragma:no-cache
Referer:http://my.origin.net/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36
预检响应如下所示
Access-Control-Allow-Headers:content-type,x-apikey
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Connection:keep-alive
Content-Length:0
Date:Mon, 05 Dec 2016 00:55:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
然后是看起来像这样的实际请求(作为带有 JSON 正文的 POST 发送)
accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Content-Length:62
content-type:application/json
DNT:1
Host:someapi.net
Origin:http://my.origin.net
Pragma:no-cache
Referer:http://my.origin.net/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36
x-apikey:someapikey
返回这样的响应(带有 JSON 正文)
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Connection:keep-alive
Content-Length:33576
Content-Type:application/json; charset=utf-8
Date:Mon, 05 Dec 2016 00:55:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
【问题讨论】:
-
不,当我试图摆脱 SO 时,我遇到了复制粘贴问题,我认为
*/*是为了在代码块中打开评论。再次删除。 -
不确定是什么问题?
-
Googlebot 声称它有一个 HTTP 200 响应,但它没有正文和标头。在其他地方进行的测试无法重现,并且该问题仅发生在 Googlebot 上。我将进行编辑以使这一点更清楚。
-
fetch()在发生网络错误时返回被拒绝的Promise。 -
@ElYobo 为什么不用Google Webmaster Tools 来调试呢?
标签: javascript cors fetch