Curl 获取纯文本 Shell 脚本,但浏览器提取 HTML

Curl 获取纯文本 Shell 脚本,但浏览器提取 HTML

我正在考虑安装 Deno,安装指南指示为 Mac/Linux Shell 发出此命令:

curl -fsSL https://deno.land/x/install/install.sh | sh

为了避免盲目执行 shell 命令,我访问了该网址在我的浏览器中,以为它会显示原始文本供我查看。令我惊讶的是,它获取了一个 HTML 页面,其中显示了安装文件以及许多其他 HTML 装饰。

当我访问curl该 URL 时,它会下载安装文件。当我在 Chrome 中浏览它时,我得到的是 HTML。

我打开了-v(详细)甚至将我的设置--user-agent为 Chromium 字符串(下面缩写),并运行以下命令,但curl似乎总是返回文本,我不知道为什么。服务器如何知道返回 HTML 而不是原始文本?我只是想了解一下,以便自己学习。有人能解释一下吗?

curl -Lv --user-agent "Mozilla/5.0 ..." https://deno.land/x/install/install.sh

答案1

正如@squillman 在评论中提到的,我的浏览器的默认accept标题是 text/html,因此我在浏览器的响应中得到了 HTML。

curl没有设置accept这样的默认标头。并且可能该特定服务器收到的任何未明确使用accepttext/html 的请求都会得到纯文本作为返回。

我做了一些实验来证明。

让浏览器获取原始文本(Javascript)

fetch("https://deno.land/x/[email protected]/install.sh", {
  "headers": {
    //this "accept" header will request HTML
    "accept": "text/html",
    "cache-control": "max-age=0",
  }
})
.then((response) => response.text())
.then((data) => console.log(data));

如果您注释掉accept该获取中的标题,您将获得原始文本。

让 CURL 获取 HTML

curl -Lv -H 'accept: text/html'  https://deno.land/x/install/install.sh

accept从 curl 命令中删除标头将返回原始文本

相关内容