【问题标题】:Why is my XMLHttpRequest getting a robots.txt response为什么我的 XMLHttpRequest 得到 robots.txt 响应
【发布时间】:2019-06-28 22:04:37
【问题描述】:

我正在编写个人 Chrome 扩展程序(注意:这些可以发出跨域请求。请参阅 https://developer.chrome.com/extensions/xhr)。

我正在尝试使用 XMLHttpRequest 访问某个网站,然后使用 javascript 从中提取数据。我的问题是该网站经常将其“机器人”页面而不是 HTML 返回给我。当然,当我在浏览器中访问该网站时,它运行良好。另外,如果我使用浏览器访问该网站,然后发出 XHR 请求,它也可以正常工作。

我认为问题可能是我的请求标头不正确。然后我修改了我的请求标头,使它们与我的浏览器相同(使用 chrome.webRequest)。不幸的是,这也不起作用。我注意到的一件事是我的浏览器在其请求标头中有一些 cookie,我不知道如何复制(见下文)。

因此,我的问题是:如何解决或调试此问题?有没有办法找出为什么该网站向我提供其“机器人”页面?如果我查看它的 robots.txt 文件,我并没有违反任何明显的规则。我对 javascript 和 web 编程很陌生,如果这是一个基本问题,很抱歉。


这是我的浏览器请求标头的示例:

GET /XXX/XXX HTTP/1.1

主机:www.example.com

连接:保持活动

升级不安全请求:1

用户代理:Mozilla/5.0(Macintosh;Intel Mac OS X 10_13_6) AppleWebKit/537.36(KHTML,如 Gecko)Chrome/71.0.3578.98 Safari/537.36

接受: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8

推荐人:https://www.example.com/XXX

接受编码:gzip、deflate、br

接受语言:en-US,en;q=0.9

Cookie:D_IID=XXX-XXX-XXX-XXX-XXX; D_UID=XXX-XXX-XXX-XXX-XXX; D_ZID=XXX-XXX-XXX-XXX-XXX; D_ZUID=XXX-XXX-XXX-XXX-XXX; D_HID=XXX-XXX-XXX-XXX-XXX; D_SID=XXX/XXX/XXX


更新

我还包括在 Chrome 中定义的“常规”标题:

请求网址:https://www.example.com/XXX

请求方法:GET

状态码:200 OK

远程地址:XXX

推荐人政策:no-referrer-when-downgrade

还有我的响应头:

缓存控制:私有、无缓存、无存储、必须重新验证

连接:保持活动

内容编码:gzip

内容类型:文本/html

日期:2019 年 2 月 6 日星期三,格林威治标准时间 XXX

边缘控制:无存储,绕过缓存

到期:格林威治标准时间 1970 年 1 月 1 日星期四 00:00:01

服务器:XXX

代理控制:无存储,绕过缓存

传输编码:分块

变化:接受编码

X-DB:0

X-DW:0

X-DZ:XXX


更新 2

查看响应 HTML 后,我不确定它是什么。我最初认为这是某种 ROBOTS 响应,因为它说 META NAME="ROBOTS",但现在我不太确定了。这是 HTML 的一般结构。

<!DOCTYPE html>
<html>
<head>
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 XXX GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="refresh" content="10; url=example.com" />
<script type="text/javascript">
// SOME JAVASCRIPT
</script>
<script type="text/javascript" src="/example.js" defer></script></head>
<body>
<div id="XXX">&nbsp;</div>
</body>
</html>

【问题讨论】:

  • 如果没有得到预期的 HTML,响应的 HTTP 状态码是什么?
  • @sideshowbarker 我添加了我的响应标头。我认为您要求的 HTTP 状态代码是“200 OK”。让我知道这是否回答了您的问题,或者我是否可以添加其他任何内容。谢谢。
  • @adnbps 嗨,我不确定这是否是您所说的帖子,因为我无法判断这两个问题是否相同。在前一种情况下,当您打开 CORS 请求的开发人员选项卡时,chrome 会隐藏标题 Cookie。在这种情况下,您似乎可以访问此标头。因此,您现在可以做的可能是尝试使用第三方 Web 请求工具(例如 Postman),并尝试隔离哪些标头使网站发送不同的响应。然后您可以尝试使用 developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/… 添加该标题
  • @semako 谢谢。我无法诊断问题。我的基本观察是,当我在浏览器中发出请求时,我的浏览器在标头中包含一些 cookie。但是,当我使用 XHR 发出请求时,它的标头中不包含 cookie。我不知道如何使用 XHR 复制浏览器的请求(包括 cookie)。你有什么想法,或者你能指出我正确的方向吗?谢谢。
  • @adnbps 下面是一个可以提供帮助的测试:当您在浏览器中以隐身模式打开页面并检查源代码时,它是否包含良好的 HTML?如果是,那么您可以通过添加/删除标头来做同样的事情,不需要 cookie(隐身模式不会在第一次请求时发送它们)。但是,如果 HTML 无效或者您必须先登录网站,则意味着您无法在不要求用户先登录网站的情况下使其工作。

标签: javascript html google-chrome google-chrome-extension xmlhttprequest


【解决方案1】:

当我查看您的用户代理时,您使用的是 Mac,Apple 的东西。

一些背景信息,Chrome 使用 Safari 的渲染引擎,因为 Apple 不允许其他引擎,Apple 政策。实际上 Chrome 只是一个 GUI 盾牌,看起来像 Chrome 但骨架仍然是 Safari。这就是为什么当 Safari 引擎出现问题时,您无法解决问题。当核心出现问题时,安装另一个浏览器无济于事。您遇到的问题就是其中之一,可悲但真实。 让我解释一下。

过去在将(Luondo)网上商店嵌入(对象/iframe)到网站中时遇到过类似的问题,也启用了跨策略等,但在 Apple 设备上不起作用(仅!)。只有 Apple 用户需要先访问网上商店的域名才能下订单(正如您所描述的,cookie 问题)。这是某种愚蠢的安全相关策略,仅在使用 Safari(或它们所需的嵌入式引擎)时存在。

我所做的(但我认为在您的情况下并没有帮助)是在检测到 Apple 设备时在页面上添加一条消息。该消息包含一个指向将在另一个标签页中打开的网店域的链接。在此之后,Apple 用户可以下订单。另请参阅荷兰语的此消息(以下翻译):



苹果用户请注意:

Safari 存在安全问题,首先您必须访问我们的网店提供商一次才能下订单。

点击以下链接打开我们网店提供商的网站,然后您可以关闭它:[link]在 Apple 设备上激活订单功能[/link]

对给您带来的不便深表歉意。


不是最好的翻译,但是,我猜你明白了。这是(从现在起,2019 年)两年前,问题仍然存在,就像你向我们展示的那样。

----------

解决方案:

无论如何,是否有解决方案,可能不适用于 Apple 用户(因为 Apple 需要解决此问题)但是,您是否在安装了 Chrome 的 Linux/Windows 机器上尝试过?我敢打赌,除非有一些安全限制服务器站点可以避免 ajax 调用,否则它会起作用,但是,我认为没有问题。

另一种方法:

1。我不知道您的技能,但是您可以考虑设置代理服务器以避免这些问题,将站点的内容嵌入(或更好地包含)到您的输出中(包括 cookie)。一个警告,这可能是非法的,因为您将另一个网站的内容合并为您自己的内容;

2。询问网站所有者,他们为他们的服务提供 API。


关于您的 ajax 方法的个人想法:

如果您想“合并”html 或提取不属于您自己的另一个站点(通过使用 javascript)的内容(如您所说),我怀疑您尝试做的事情是否合法。我认为这也是您不想提及“服务”的名称/域的原因(示例不是我想的服务)。试着弄清楚你想做的事情实际上是合法的,如果不是,这一切都是浪费时间,除非有我上面解释的 API。


也许这一切对您来说听起来不像是一个答案,但它会让您(希望)对实际问题有所了解。

祝你周六愉快,希望对你有所帮助。

【讨论】:

    【解决方案2】:

    我的问题是:我该如何解决或调试这个问题?

    要调试,请尝试 Fiddler、mitmproxy、Wireshark 或任何 http(s) 调试代理,并查看您的扩展如何发送 XMLHttpRequest 标头。

    还可以尝试使用Postman 模拟浏览器请求或在 Chrome 开发工具中运行 XMLHttpRequest。

    我猜,这是因为X-Requested-With: XMLHttpRequest 标头。

    【讨论】:

    • 我以前也使用过 Postman - 这是尝试了解事情真相的好方法。正如下面提到的人,虽然我怀疑用户代理是原因。
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2012-12-06
    • 2017-11-21
    • 2018-11-22
    • 2015-07-09
    相关资源
    最近更新 更多