2009-08-12 109 views
55

在使用XMLHttpRequest進行AJAX調用時,似乎無法更改JavaScript中的大多數請求標頭。請注意,request.setRequestHeader必須在Gecko瀏覽器中的request.open()之後調用(請參閱http://ajaxpatterns.org/Talk:XMLHttpRequest_Call)。當我設置Referer,它沒有得到設置(我看着使用Firebug和篡改數據發送的請求標頭)。當我設置用戶代理時,它完全搞砸了AJAX調用。設置接受內容類型確實工作,但是。我們是否阻止在Firefox 3中設置RefererUser-Agent在JavaScript中設置請求標頭

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"); 
    } 
    } 
} 
+1

副手不確定(現在也沒有工具可以測試),但看起來很可能,因爲這兩個頭文件不需要設置,事實上設置它們本質上是可疑的 – annakata 2009-08-12 20:55:49

回答

64

W3C Spec on setrequestheader

簡要點:

如果請求報頭已經 已經設置,則新值 必須使用一個U + 002C COMMA隨後 一個U + 0020級聯到現有 值空間分離。

UA可以給用戶代理頭一個初始值,但必須允許作者附加值。

但是 - 在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

是的,FF明確否認編輯「確定標題「:http://mxr.mozilla.org/mozilla1.8.0/source/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp#1637 – 2013-04-03 23:14:06

3

@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

+0

是的,這很奇怪。舊草案gnarf指出,UA必須允許作者將內容附加到User-Agent標題。但是目前的規範說UA必須忽略對User-Agent頭的任何修改嘗試。 – Robert 2014-08-28 18:33:31