web-dev-qa-db-fra.com

JavaScript window.location ne définit pas le référent dans l'en-tête de la demande

Je comprends que compter sur Referer dans l'en-tête de demande n'est pas correct. Mais ma question est, pourquoi IE ne définit pas Referer sur l'en-tête de demande si j'utilise window.location? Des pensées ou des corrections?

Cela ne définit pas Referer dans l'en-tête Request:

function load1() {
   window.location = "https://" + serverURL + "/path/folder/page.aspx";
}

<a href="javascript:load1()">Link 1</a>

Alors que cela définit:

<a href="https://hardcode.server.url/path/folder/page.aspx">Link 1</a>
28
Sha Le

Le titre de votre message montre que vous souhaitez modifier la page actuelle par programmation en utilisant JavaScript mais en ayant toujours le référent HTTP fourni (d'après ce que j'ai compris, l'utilisation d'une balise <a> Est juste pour un cas de test).

Vous devez être conscient des problèmes inter-navigateurs:

  • L'en-tête de référence HTTP (HTTP-Referer) est défini lors de la modification de window.location.href Sous les navigateurs suivants:
    • MSIE 9 (mais probablement toute version supérieure à 9)
    • Firefox (au moins 3.0, 3.5, 4.0, 5.0, mais très probablement toutes les versions)
    • Chrome (au moins 9, mais probablement toutes les versions)
    • Safari (au moins 5, mais probablement toutes les versions)
    • Opera (au moins 11, mais probablement toutes les versions)
  • MSIE (au moins 6, 7, 8) : le référent n'est pas défini lors de la modification de window.location.href (c'est pourquoi certaines pseudo-solutions sont basées sur myLink.click())
  • Firefox (au moins 3.0, 3.5, 4.0) : la fonction click n'existe pas (c'est pourquoi les pseudo-solutions basées sur myLink.click() ne fonctionne pas)
  • Firefox 5 : la fonction click existe sous Firefox 5 mais ne change pas l'emplacement de la fenêtre, donc toutes les méthodes s'appuyant sur l'existence de la méthode myLink.click() ne fonctionnera pas. Appeler myLink.onclick() ou myLink.onClick() déclenche une erreur ("onclick n'est pas une fonction"), donc solutions basées sur ces appels ne fonctionnera pas.

Afin de gérer ces problèmes inter-navigateurs, j'utilise la méthode suivante:

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");

Cette solution fonctionne sur toutes les versions et versions de navigateur répertoriées ci-dessus. Il a l'avantage d'être simple, multi-navigateur et facile à comprendre. Notez que cela n'a pas été testé sous HTTP [~ # ~] s [~ # ~] .

35
Julien Kronegg

Réglage window.location n'est pas la même chose que de suivre un lien sur cette page. Il démarre une nouvelle demande pour la page comme si l'utilisateur avait tapé l'URL dans la barre d'adresse du navigateur.

J'ai réussi à trouver une solution de contournement:

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();
}

Il crée un lien sur la page et simule un clic. Le résultat est un changement de window.location et le référent est rempli.

http://ianso.blogspot.com/2006/01/referer-header-not-set-on-http.html

18
Evan Mulawski

Je n'ai pas assez de points pour commenter la réponse d'Evan pour suggérer une correction donc tout ce que je peux faire est de poster la correction ici. En bref, document.createElement(a) manque de guillemets et devrait être document.createElement("a") à la place. Cela devrait également résoudre les inquiétudes de Kevin concernant FF5.

Toute la fonction telle que je l'ai écrite:

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;
    }
}

Cela fonctionne dans notre environnement HTTPS avec IE7, IE8, FF3, FF7 et Chrome. J'imagine donc que cela fonctionne aussi en FF5. Sans cette solution de contournement, nous obtenons 403 erreurs dans IE7 et IE8 lors de la tentative de définition de window.location. En ce qui concerne la question de Sha Le pour savoir pourquoi IE fait cela, je ne peux que deviner, c'est qu'ils pensent que c'est trop peu sûr. J'ai eu un problème similaire avec window.open dans IE que je devais également contourner.

4
juanitogan

Est-il possible de déclencher un événement de clic d'un lien (ou de n'importe quel élément) via JavaScript? utilise une solution createEvent/dispatchEvent ou createEventObject/fireEvent.

0
Kevin Hakanson