8

Chrome 拡張機能の特定の AJAX リクエストに "Referer"-HTTP-Header を追加しようとしています。AJAX リクエストで直接変更することはできないため、 webRequest APIを使用して変更しようとしました。

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) {
    console.log("onBeforeSendHeaders fired");
    var xdata=data.requestHeaders;
    xdata.push({
        "name":"Referer",
        "value": "http://the.new/referrer"
    })
    return {requestHeaders: xdata};
}, { //Filter
    urls: ["<all_urls>"], //For testing purposes
    types: ["xmlhttprequest"]
},["requestHeaders","blocking"]);

しかし、これは私の拡張機能の AJAX リクエストでは機能しません。他のAJAXリクエストでのみイベントを発生させますが、私の拡張機能で行われたものでは発生しません。
もう1つの奇妙なことは、「ブロッキング」フラグが設定されていない場合はすべて正常に機能しますが、ヘッダーを変更できないことです。

これを解決する方法を知っている人はいますか(または私の目標を達成する別の方法:サイトリクエストの「Referer」を変更してコンテンツを取得する)

ありがとうございました :)

4

5 に答える 5

5

これは、すべてのインスタンスで機能する作業バージョンです (リファラー ヘッダーが既に設定されている場合、または設定されていない場合)。

var requestFilter = {
    urls: ["<all_urls>"]
},

extraInfoSpec = ['requestHeaders', 'blocking'],
handler = function(details) {

var isRefererSet = false;
var headers = details.requestHeaders,
    blockingResponse = {};

for (var i = 0, l = headers.length; i < l; ++i) {
    if (headers[i].name == 'Referer') {
        headers[i].value = "http://your-url.com/";
        isRefererSet = true;
        break;
    }
}

if (!isRefererSet) {
    headers.push({
        name: "Referer",
        value: "http://your-url.com/"
    });
}

blockingResponse.requestHeaders = headers;
return blockingResponse;
};

chrome.webRequest.onBeforeSendHeaders.addListener(handler, requestFilter, extraInfoSpec);

次のすべてのアクセス許可をマニフェストに追加することを忘れないでください。

"permissions": [  "webRequest", "webRequestBlocking", "<all_urls>" ]
于 2014-09-27T03:55:08.837 に答える
3

ブロッキング リクエストがない場合に Referrer ヘッダーを設定できない理由は、リクエストがすでに送信されている可能性があるためです。非同期で通知され、リクエストについて何も変更できません。

ヘッダーを変更するには、次のコードを使用します。

function mod_headers(header_array,p_name,p_value) {
     var did_set = false;                                                                                      
     for(var i in header_array) {                                                                                                   
         var header = header_array[i];                                                                                              
         var name = header.name;                                                                                                    
         var value = header.value;                                                                                                  

         // If the header is already present, change it:
         if(name == p_name) {
             header.value = p_value;
             did_set = true;
         }                                                                                                         
     }
     // if it is not, add it:
     if(!did_set) { header_array.push( { name : p_name , value : p_value } ); }                                                                                                                       
 }
于 2012-07-22T18:11:42.267 に答える
0

動いていない。詳細については、http://code.google.com/p/chromium/issues/detail?id=132731をご覧ください。

于 2012-07-22T11:49:00.220 に答える
-1
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
     console.log(details);
},{urls: ["<all_urls>"]});
于 2016-11-28T19:20:30.923 に答える