在 JavaScript 中设置请求标头

IT技术 javascript ajax
2021-01-16 10:10:03

在使用 XMLHttpRequest 进行 AJAX 调用时,我似乎无法从 JavaScript 更改大多数请求标头。请注意,request.setRequestHeader必须request.open()在 Gecko 浏览器中调用when (请参阅http://ajaxpatterns.org/Talk:XMLHttpRequest_Call)。当我设置Referer 时,它没有设置(我查看了使用 Firebug 和 Tamper Data 发送的请求标头)。当我设置User-Agent 时,它完全搞砸了 AJAX 调用。但是,设置AcceptContent-Type确实有效。我们是否无法在 Firefox 3 中设置RefererUser-Agent

var request = new XMLHttpRequest();
var path="http://www.yahoo.com";
request.onreadystatechange=state_change;

request.open("GET", path, true);
request.setRequestHeader("Referer", "http://www.google.com");
//request.setRequestHeader("User-Agent", "Mozilla/5.0");
request.setRequestHeader("Accept","text/plain");
request.setRequestHeader("Content-Type","text/plain");

request.send(null);
    function state_change()
{
if (request.readyState==4)
  {// 4 = "loaded"
  if (request.status==200)
    {// 200 = OK
    // ...our code here...
    alert('ok');
    }
  else
    {
    alert("Problem retrieving XML data");
    }
  }
}
3个回答

关于 setrequestheader 的 W3C 规范

简要要点:

如果已经设置了请求头,那么新值必须使用 U+002C 逗号连接到现有值,后跟 U+0020 空格用于分隔。

UA 可以给 User-Agent 头一个初始值,但必须允许作者向它附加值。

但是 - 在 jQuery 中搜索框架 XHR 后,它们不允许您更改 User-Agent 或 Referer 标头。最接近的事情:

// Set header so the called script knows that it's an XMLHttpRequest
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

我倾向于认为您想要做的是被 FF 中的安全策略拒绝 - 如果您想传递一些自定义Referer类型标头,您可以随时执行以下操作:

xhr.setRequestHeader('X-Alt-Referer', 'http://www.google.com');
是的,FF 明确拒绝编辑“某些标题”:mxr.mozilla.org/mozilla1.8.0/source/extensions/xmlextras/base/...
2021-03-29 10:10:03

@gnarf 答案是正确的。想添加更多信息。

Mozilla 错误参考:https : //bugzilla.mozilla.org/show_bug.cgi? id =627942

如果标头是以下标头之一的不区分大小写的匹配,则终止这些步骤:

Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Date
DNT
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
User-Agent
Via

来源:https : //dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader

是的,这很奇怪。旧草案 gnarf 指的是说 UA 必须允许作者将内容附加到 User-Agent 标头。但是当前的规范说 UA 必须忽略对 User-Agent 标头的任何修改尝试。
2021-04-11 10:10:03

对于现在查找此内容的人:

User-Agent从 Firefox 43 开始,现在似乎允许设置标头。请参阅https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_​​header_name了解当前的禁用标头列表。

如果这里的“这个标题”是你的意思Referer,那么不,你不能修改它。这是被禁止的。官方禁止请求标头列表位于 < fetch.spec.whatwg.org/#forbidden-header-name >。当您提供此答案时,MDN 可能陈述了不正确的信息。IIRC 这个标头曾经允许附加到它——但不是它的彻底设置——所以它并不总是在禁止的请求标头列表中。但是,其修改仍然受到严格限制。
2021-03-20 10:10:03
@cmt 你说得对!谢谢,我改进了我的答案以指定User-Agent现在可以更改。
2021-04-05 10:10:03