发送自定义用户代理字符串以及我的标头(获取)

Posted

技术标签:

【中文标题】发送自定义用户代理字符串以及我的标头(获取)【英文标题】:Sending a custom User-Agent string along with my headers (fetch) 【发布时间】:2017-08-06 12:09:12 【问题描述】:

我在 React 中使用 fetch API,并且从 JSON 端点提取一些数据。

作为我请求的一部分,我想发送一个自定义的User-Agent 字符串。目前,当我检查我的请求时,UA 字符串是:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/56.0.2924.87 Safari/537.36

因为我在每个请求中都输入了标头,所以我想我只需将 User-Agent 附加到标头对象中,就像它在 various places 在线中所说的那样:

fetch(url, 
    Accept: 'application/json',
    'Content-Type': 'application/json',
    'User-Agent': 'MY-UA-STRING' // <---
)

但这不起作用。据here 和here 和here 报告,我感觉这是因为fetch api 中的一个错误。

任何人都可以解决如何使用fetch 将UA 作为headers 的一部分传递?

【问题讨论】:

【参考方案1】:

经过一些测试,Chrome 确实存在 User-Agent 标头的错误。

这很可能是由于不久前(2015 年中)User-Agent 标头在不允许的标头列表中。

由于这个特定的标头最近已从不允许的标头列表中删除,Firefox(从版本 43 开始)将允许您在 fetch 调用中更改 User-Agent,但 Chrome 不会。

这是Firefox bug 和Chromium bug

首先不允许它的原因是,确实没有充分的理由使用 User-Agent 标头发送任意数据,它应该用于发送实际的 User-Agent 和浏览器内请求,例如无论如何,XMLHttpRequest 的获取确实没有充分的理由来欺骗用户代理。

Chrome 什么时候会修复这个 bug 是任何人的猜测,但它确实是一个 bug,因为不允许的头列表不再列出 User-Agent 头,当在 Fetch 的选项对象中指定时它应该会改变。

作为旁注,您通常应该使用Headers Interface 创建标题,并将它们包含在headers 键下的options objects 中

let headers = new Headers(
    "Accept"       : "application/json",
    "Content-Type" : "application/json",
    "User-Agent"   : "MY-UA-STRING"
);

fetch(url, 
    method  : 'GET', 
    headers : headers 
    // ... etc
).then( ...

【讨论】:

这似乎不是一个错误,因为这并没有改变 回复:“没有好的理由”段落,一些freeAPIs 要求您设置User-Agent 标头以说明您的应用程序和联系电子邮件是什么,以防止滥用。我不确定这是对 User-Agent 的预期用途——也许这是这些 API 的一个错误——但这是我们在 fetch 中设置User-Agent 的正当理由。 谷歌浏览器不愿纠正这个错误可能在于它会严重阻碍browser fingerprinting;这恰好在广告行业中发挥了重要作用。其他涉及隐私的标头是 Referer [原文如此] 和 Origin

以上是关于发送自定义用户代理字符串以及我的标头(获取)的主要内容,如果未能解决你的问题,请参考以下文章

在匿名代理后面获取用户ip

使用SwiftMessage从回复电子邮件中获取Laravel中的自定义标头

AJAX 使用 CORS 获取自定义响应标头

如何阻止用户使用 JWT 创建自定义 POST 请求?

如何使用 okhttp 更改连接请求的标头

ExtJS - 使用同步时发送自定义标头