在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头。请注意,必须在Gecko浏览器中request.setRequestHeader
之后调用request.open()
(请参阅http://ajaxpatterns.org/Talk:XMLHttpRequest_Call)。当我设置 Referer 时,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头)。当我设置 User-Agent 时,它完全搞砸了AJAX调用。但是,设置接受和 Content-Type 确实有效。我们是否阻止在Firefox 3中设置 Referer 和 User-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");
}
}
}
答案 0 :(得分:70)
简要说明:
如果请求标头有 已设置,然后是新值 必须连接到现有的 使用U + 002C COMMA后跟的值 用于分离的U + 0020空间。
UAs可以为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');
答案 1 :(得分:4)
@gnarf回答是对的。想要添加更多信息。
Mozilla Bug参考:https://bugzilla.mozilla.org/show_bug.cgi?id=627942
如果header是以下标题之一的不区分大小写的匹配项,请终止这些步骤:
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
答案 2 :(得分:1)
对于现在正在寻找此事的人:
从Firefox 43开始,现在似乎允许设置User-Agent
标头。有关禁止标头的当前列表,请参阅https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name。