2012-03-06 2 views
36

Я хочу установить заголовок Referer на моей веб-странице. В настоящее время он отображает «xyz», и я хочу установить его на «abc».Как вручную установить заголовок REFERER в Javascript?

Рассматриваемый реферер с помощью javascript:alert(document.referer)

+1

Это предложение было задано раньше: http://stackoverflow.com/questions/220231/accessing-http-headers-in-javascript –

+2

Вы не можете этого сделать. –

+2

@TiesonT. На самом деле, этот вопрос касается доступа к HTTP-заголовкам, а не переопределения заголовка «Referer». –

ответ

23

Вы не можете установить Referer заголовок вручную, но вы можете использовать location.href установить referer заголовок ссылки, используемой в href, но это приведет к перегрузке страницы.

+1

спасибо, что он меняет референта, но он меняет URL-адрес сервера селена. Поэтому я считаю, что изменить референт невозможно. –

+4

@ABG. Если у вас есть шанс, вы можете написать немного больше о том, как ваш ответ материализуется в коде? Например. короткий фрагмент javascript или фрагмент HTML-кода? – condiosluzverde

+2

@jsmcfrind Немного поздно, но если вы просто сделаете 'window.location.reload()', это приведет к перезагрузке страницы, и если вы проверите 'document.referrer', она будет равна текущей странице, а не тому, что она может были раньше. Пробовал создавать тестовый файл в jsfiddle, но не смог из-за природы песочницы веб-сайта. [(Хотя я создал несколько забавный рекурсивный jsfiddle в этом процессе.)] (Http://jsfiddle.net/gjvLoarf/2/) – KhalilRavanna

25

Вы можете использовать Object.defineProperty на объект документа для свойства ссылающейся:

Object.defineProperty(document, "referrer", {get : function(){ return "my new referrer"; }}); 

К сожалению, это не будет работать на любой версии сафари < = 5, Firefox < 4, Chrome < 5 и Internet Explorer < 9, поскольку он не позволяет defineProperty использоваться на объектах dom.

+0

это работает отлично! –

+1

Работает также. Предпочитаю это ответить на @ casivaagustin, хотя его работы тоже – Ema4rl

+0

Вы отлично! Спасибо :) –

17

Это работает в Chrome, Firefox, не работает в Safari :(, не проверял в других браузерах

 delete window.document.referrer; 
     window.document.__defineGetter__('referrer', function() { 
      return "yoururl.com"; 
     }); 

увидел, что здесь https://gist.github.com/papoms/3481673

С уважением

тест: https://jsfiddle.net/bez3w4ko/ (так что вы можете легко протестировать несколько браузеров), и вот тест с фреймами https://jsfiddle.net/2vbfpjp1/1/

+2

просто протестировал это, и он не работал –

+0

работает на браузерах с хромом – Ema4rl

+0

, но как насчет того, когда пользователь пытается получить доступ к новому сайту ??? например, есть ссылка на сайте1.com, которая перенаправляет пользователя на site2.com –

2

Выше решения не работает для меня, я пробовал следовать и работает во всех браузерах.

просто сделал фальшивый вызов ajax, он сделает запись в заголовке рефеера.

var request; 
if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
    request = new XMLHttpRequest(); 
} else if (window.ActiveXObject) { // IE 
    try { 
     request = new ActiveXObject('Msxml2.XMLHTTP'); 
    } catch (e) { 
     try { 
      request = new ActiveXObject('Microsoft.XMLHTTP'); 
     } catch (e) {} 
    } 
} 
request.open("GET", url, true); 
request.send(); 
+0

как я должен попробовать это? можете ли вы предоставить мне шаги для этого, поскольку я использовал много способов изменить заголовок referrar, но ничего не работает? –

2

Вы не можете изменить свойство REFERRER. То, что вы просите, - подменить запрос.

Только в случае, если вы хотите реферер должен быть установлен, как вы открыли URL непосредственно или в течение времени кулака {HTTP реферер = NULL}, то перезагрузите страницу

location.reload(); 
+0

это только удаляет заголовок referrer. не добавляет настраиваемый заголовок –

+0

Вправо. вопрос заключается не в добавлении настраиваемого заголовка. – Vaibs

0

Вы можете изменить значение из referrer в HTTP-заголовке с использованием API веб-запроса.

Для этого требуется фоновый js-скрипт. Вы можете использовать onBeforeSendHeaders, поскольку он изменяет заголовок перед отправкой запроса.

Ваш код будет выглядеть примерно так:

chrome.webRequest.onBeforeSendHeaders.addEventListener(function(details){ 
    var newRef = "http://new-referer/path"; 
    var hasRef = false; 
    for(var n in details.requestHeaders){ 
     hasRef = details.requestHeaders[n].name == "Referer"; 
     if(hasRef){ 
      details.requestHeaders[n].value = newRef; 
     break; 
     } 
    } 
    if(!hasRef){ 
     details.requestHeaders.push({name:"Referer",value:newRef}); 
    } 
    return {requestHeaders:details.requestHeaders}; 
}, 
{ 
    urls:["http://target/*"] 
}, 
[ 
    "requestHeaders", 
    "blocking" 
]); 

URLs: Он действует как фильтр запроса и вызывает слушателя только для определенных запросов.

Для получения дополнительной информации: https://developer.chrome.com/extensions/webRequest

+0

любой шанс лучшего примера? где я должен вставить это? – Toolkit

+0

Предполагается создать фоновый скрипт и вставить его в этот файл. Обязательно добавьте файл в качестве фонового сценария в манифест. – Nalin

0

Если вы хотите изменить (URL) заголовок Referer, который будет отправлен на сервер, когда пользователь нажимает на якорь или IFRAME открыт, вы можете сделать это без каких-либо хаков , Просто делайте историю.replaceState, вы измените URL-адрес, как он появится в строке браузера, а также референт, который будет отправлен на сервер.

+0

Вы можете заменить фрагменты path или add-remove, а не домен с 'history.replaceState'. [developer.mozilla.org в history.replaceState] (https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState() _method) – Cemal

Смежные вопросы