リクエストヘッダーでRefererに依存するのは正しくないことを理解しています。しかし、私の質問は、なぜIEがwindow.location
を使用する場合、Refererをリクエストヘッダーに設定しないのですか?
これはリクエストヘッダーにリファラーを設定しません:
function load1() {
window.location = "https://" + serverURL + "/path/folder/page.aspx";
}
<a href="javascript:load1()">Link 1</a>
設定中:
<a href="https://hardcode.server.url/path/folder/page.aspx">Link 1</a>
あなたの投稿タイトルは、JavaScriptを使用してプログラムで現在のページを変更したいが、HTTPリファラーを提供したままであることを示しています(私が理解したことから、<a>
タグはテストケース用です)。
クロスブラウザの問題に注意する必要があります。
window.location.href
を変更すると、HTTPリファラーヘッダー(HTTP-Referer)が設定されます:window.location.href
を変更するときに設定します(これが、一部の擬似ソリューションがmyLink.click()
に基づいている理由です)click
関数が存在しない(これが、myLink.click()
は機能しません)click
関数はFirefox 5の下に存在しますが、ウィンドウの場所は変更しないため、 myLink.click()
メソッドは機能しません。 myLink.onclick()
またはmyLink.onClick()
を呼び出すとエラーが発生するため(「onclickは関数ではありません」)、 これらの呼び出しに基づくソリューション は機能しません。これらのクロスブラウザの問題を管理するために、次の方法を使用しています。
function navigateToUrl(url) {
var f = document.createElement("FORM");
f.action = url;
var indexQM = url.indexOf("?");
if (indexQM>=0) {
// the URL has parameters => convert them to hidden form inputs
var params = url.substring(indexQM+1).split("&");
for (var i=0; i<params.length; i++) {
var keyValuePair = params[i].split("=");
var input = document.createElement("INPUT");
input.type="hidden";
input.name = keyValuePair[0];
input.value = keyValuePair[1];
f.appendChild(input);
}
}
document.body.appendChild(f);
f.submit();
}
navigateToUrl("http://foo.com/bar");
このソリューションは、上記のすべてのブラウザーフレーバーとバージョンで機能します。シンプルで、マルチブラウザで、理解しやすいという利点があります。これはHTTP[〜#〜] s [〜#〜]でテストされていないことに注意してください。
window.location
を設定することは、そのページのリンクをたどることと同じではありません。ユーザーがブラウザのアドレスバーにURLを入力したと考えられるため、ページの新しいリクエストを開始します。
私は回避策を見つけることができました:
function goTo(url)
{
var a = document.createElement("a");
if(!a.click) //for IE
{
window.location = url;
return;
}
a.setAttribute("href", url);
a.style.display = "none";
document.body.appendChild(a);
a.click();
}
ページ上にリンクを作成し、クリックをシミュレートします。その結果、window.location
が変更され、リファラーが作成されます。
http://ianso.blogspot.com/2006/01/referer-header-not-set-on-http.html
私は修正を提案するためにエヴァンの答えにコメントするのに十分なポイントを持っていないので、ここで修正を投稿するだけです。つまり、document.createElement(a)
には引用符がないため、代わりにdocument.createElement("a")
にする必要があります。これにより、FF5に関するKevinの懸念も修正されるはずです。
私が書いた機能全体:
function goTo(url)
{
var a = document.createElement("a");
if (a.click)
{
// HTML5 browsers and IE support click() on <a>, early FF does not.
a.setAttribute("href", url);
a.style.display = "none";
document.body.appendChild(a);
a.click();
} else {
// Early FF can, however, use this usual method
// where IE cannot with secure links.
window.location = url;
}
}
これは、IE7、IE8、FF3、FF7、およびChromeを使用したHTTPS環境で機能します。だから、FF5でも機能すると思います。この回避策がなければ、window.locationを設定しようとするとIE7およびIE8で403エラーが発生します。 IEがこれを行う理由に関するSha Leの質問に関しては、彼らはそれがあまりにも安全ではないと信じているだけです。私はIE私も回避しなければならなかったこと。
JavaScriptを使用してリンク(または任意の要素)のクリックイベントをトリガーできますか? createEvent/dispatchEventまたはcreateEventObject/fireEventソリューションを使用します。