web-dev-qa-db-ja.com

JavaScript window.locationはリクエストヘッダーにリファラーを設定しません

リクエストヘッダーで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>
28
Sha Le

あなたの投稿タイトルは、JavaScriptを使用してプログラムで現在のページを変更したいが、HTTPリファラーを提供したままであることを示しています(私が理解したことから、<a>タグはテストケース用です)。

クロスブラウザの問題に注意する必要があります。

  • 次のブラウザでwindow.location.hrefを変更すると、HTTPリファラーヘッダー(HTTP-Referer)が設定されます:
    • MSIE 9(ただし、おそらく9より上のバージョン)
    • Firefox(少なくとも3.0、3.5、4.0、5.0、しかしほとんどすべてのバージョン)
    • Chrome(少なくとも9、しかしほとんどすべてのバージョン)
    • Safari(少なくとも5ですが、おそらくすべてのバージョン)
    • Opera(少なくとも11ですが、おそらくすべてのバージョン)
  • MSIE(少なくとも6、7、8):リファラーはnotwindow.location.hrefを変更するときに設定します(これが、一部の擬似ソリューションがmyLink.click()に基づいている理由です)
  • Firefox(少なくとも3.0、3.5、4.0)click関数が存在しない(これが、myLink.click()は機能しません)
  • Firefox 5click関数は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 [〜#〜]でテストされていないことに注意してください。

35
Julien Kronegg

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

18
Evan Mulawski

私は修正を提案するためにエヴァンの答えにコメントするのに十分なポイントを持っていないので、ここで修正を投稿するだけです。つまり、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私も回避しなければならなかったこと。

4
juanitogan

JavaScriptを使用してリンク(または任意の要素)のクリックイベントをトリガーできますか? createEvent/dispatchEventまたはcreateEventObject/fireEventソリューションを使用します。

0
Kevin Hakanson