在JavaScript中设置请求头

在JavaScript中设置请求头,javascript,ajax,Javascript,Ajax,在使用XMLHttpRequest进行AJAX调用时,我似乎无法从JavaScript更改大多数请求头。请注意,当Gecko浏览器中的request.setRequestHeader必须在request.open()之后调用时(请参阅)。当我设置Referer时,它没有被设置(我查看了使用Firebug和篡改数据发送的请求头)。当我设置用户代理时,它完全打乱了AJAX调用。但是,设置Accept和Content Type确实有效。在Firefox3中,我们是否被阻止设置引用器和用户代理 var-

在使用XMLHttpRequest进行AJAX调用时,我似乎无法从JavaScript更改大多数请求头。请注意,当Gecko浏览器中的
request.setRequestHeader
必须在
request.open()之后调用时(请参阅)。当我设置Referer时,它没有被设置(我查看了使用Firebug和篡改数据发送的请求头)。当我设置用户代理时,它完全打乱了AJAX调用。但是,设置Accept和Content Type确实有效。在Firefox3中,我们是否被阻止设置引用器和用户代理

var-request=new-XMLHttpRequest();
变量路径=”http://www.yahoo.com";
request.onreadystatechange=state\u change;
打开(“获取”,路径,true);
setRequestHeader(“Referer”http://www.google.com");
//setRequestHeader(“用户代理”、“Mozilla/5.0”);
setRequestHeader(“接受”、“文本/普通”);
setRequestHeader(“内容类型”、“文本/普通”);
请求发送(空);
函数状态_change()
{
if(request.readyState==4)
{//4=“已加载”
如果(请求状态==200)
{//200=OK
//…我们的代码在这里。。。
警报(“正常”);
}
其他的
{
警报(“检索XML数据时出现问题”);
}
}
}

要点如下:

如果请求头中有 已设置,则为新值 必须连接到现有的 使用U+002C逗号后跟 U+0020分隔空间

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

但是,在jQuery中搜索框架XHR后,它们不允许您更改用户代理或引用器头。最接近的事情:

// Set header so the called script knows that it's an XMLHttpRequest
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
我倾向于这样的观点,即您想要做的是被FF中的安全策略拒绝-如果您想要传递一些自定义
Referer
type头,您可以始终执行以下操作:

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

@答案是正确的。希望添加更多信息

Mozilla错误参考:

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

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

来源:

对于现在正在查找此信息的用户:


从Firefox43开始,现在似乎可以设置
用户代理
头了。有关当前禁用标题的列表,请参阅

不确定(目前也没有测试工具),但这似乎很有可能,因为这两个标题都不需要设置,事实上设置它们本质上是可疑的。是的,FF明确否认编辑“某些标题”:是的,这很奇怪。gnarf的旧草案提到,UAs必须允许作者将内容附加到用户代理头中。但当前规范规定,UAs必须忽略对用户代理标头的任何修改尝试。如果此处的“此标头”是指
Referer
,则不,您不能修改它。这是禁止的。官方禁止的请求头列表位于。当您提供此答案时,MDN可能说明了不正确的信息。IIRC此头用于允许附加到它——但不允许直接设置它——因此它并不总是在禁止请求头列表中。但是,它的修改仍然受到严格限制。@cmt你说得对!谢谢,我改进了我的答案,指定现在可以更改
用户代理。