【问题标题】:Googlebot and empty CORS responsesGooglebot 和空 CORS 响应
【发布时间】: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


【解决方案1】:

检查失败的 GoogleBot 调用的 IP 地址

可能是个恶毒的演员,冒充谷歌

按照此处所述检查 IP 地址:

https://support.google.com/webmasters/answer/80553?hl=en

【讨论】:

  • 是的,好点;我已将 IP 日志记录添加到错误日志中,因此我们将看看结果如何。
  • 它似乎是合法的,例如crawl-66-249-79-185.googlebot.com.
  • 嗯,你是如何调试这些请求的?
猜你喜欢
  • 2012-06-04
  • 2016-08-04
  • 2019-03-01
  • 2012-09-26
  • 2021-10-13
  • 2017-10-08
  • 2016-08-05
  • 2014-08-04
  • 2018-05-02
相关资源
最近更新 更多