在JavaScript中设置请求标头

看来,我无法使用XMLHttpRequest进行AJAX调用时从JavaScript更改大多数请求标头。 请注意, request.setRequestHeader必须在Gecko浏览器中的request.open()之后调用(请参阅http://ajaxpatterns.org/Talk:XMLHttpRequest_Call )。 当我设置Referer时 ,它没有被设置(我查看了使用Firebug和Tamper Data发送的请求头)。 当我设置用户代理 ,它完全搞砸了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"); } } } 

关于setrequestheader的W3C规范 。

简要说明:

如果请求头已经被设置,那么新值必须使用U + 002C COMMA连接U + 0020 SPACE进行分离,连接到现有值。

UA可以给用户代理头一个初始值,但必须允许作者附加值。

但是 – 在jQuery中search框架XHR之后,他们不允许您更改User-Agent或Referer头。 最接近的事情:

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

我倾向于认为你想要做的是被FF中的安全策略拒绝 – 如果你想传递一些自定义的Referertypes头,你可以随时做:

 xhr.setRequestHeader('X-Alt-Referer', 'http://www.google.com'); 

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

Mozilla的Bug参考: 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

对于现在看这个的人来说。

现在看来,现在设置这个头是允许的,因为Firefox43。请参阅https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_​​header_name当前禁止标题列表。;