2011-01-21 13 views
27

Entiendo que confiar en Referer en el encabezado de la solicitud no es correcto. Pero mi pregunta es, ¿por qué IE no establece Referer en el encabezado de solicitud si uso window.location? ¿Alguna idea o solución?JavaScript window.location no establece referer en el encabezado de solicitud

Esto no establece Referer en el encabezado de la solicitud:

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

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

Mientras que esto establece:

<a href="https://hardcode.server.url/path/folder/page.aspx">Link 1</a> 
+0

¿Has probado, ir(), navegar() o href? window.location no navega a una página, sino que simplemente redirige allí. –

Respuesta

18

Configuración window.location no es lo mismo que seguir un enlace en esa página. Comienza una nueva solicitud para la página, ya que el usuario escribió la URL en la barra de direcciones del navegador.

Me las arreglé para localizar una solución:

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

Se crea un enlace en la página y simula un clic. El resultado es un cambio en window.location y el referente se rellena.

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

+0

No necesita jQuery para esto. $ ("cuerpo"). appendChild (a) se puede reemplazar por document.body.appendChild (a); –

+0

@Anonymous: Gracias. He corregido el código. –

+0

Muchas gracias por hacerlo. Pensé que eras un robot desalmado. :) –

-3

Yeap, el suyo funciona tan bien, pero terminó haciendo:

<a href="#" id="linkOne">Link 1</a> 

<script type="text/javascript"> 
    document.getElementById("linkOne").href = "https://" + serverURL + "/path/folder/page.aspx"; 
</script> 
+2

Todo lo que hace es establecer el href de una etiqueta de anclaje. No hace nada a menos que el usuario haga clic en ese enlace. –

4

No tengo suficientes puntos para comentar sobre la respuesta de Evan como para sugerir una corrección, así que todo lo que puedo hacer es publicar la corrección aquí. En resumen, document.createElement(a) faltan comillas y debería ser document.createElement("a") en su lugar. Esto también debería arreglar la preocupación de Kevin sobre FF5.

toda la función como lo escribí:

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

Esto funciona en nuestro entorno HTTPS con IE7, IE8, FF3, FF7, y Chrome. Entonces me imagino que también funciona en FF5. Sin esta solución, obtenemos 403 errores en IE7 e IE8 cuando intentamos establecer window.location. En cuanto a la pregunta de Sha Le sobre por qué IE hace esto, lo único que puedo adivinar es que creen que es demasiado inseguro. Tuve un problema similar con window.open en IE y tuve que trabajar también.

35

El título de su publicación muestra que desea cambiar la página actual programáticamente utilizando JavaScript pero teniendo la referencia HTTP proporcionada (por lo que entendí, usar una etiqueta <a> es solo para un caso de prueba).

Necesita ser conscientes de los problemas entre navegadores:

  • El encabezado de referencia HTTP (HTTP Referer) se establece cuando se cambia window.location.href bajo las siguientes navegadores:
    • MSIE 9 (pero probablemente cualquier versión anterior 9)
    • Firefox (al menos 3.0, 3.5, 4.0, 5.0, pero la mayoría probablemente todas las versiones)
    • Chrome (al menos 9, pero lo más probable todas las versiones)
    • Safari (al menos 5, pero la mayoría probablemente todas las versiones)
    • Opera (al menos 11, pero lo más probable todas las versiones)
  • MSIE (al menos 6, 7, 8): la de referencia es no conjunto cuando se cambia window.location.href (esta es la razón por algunos pseudo-soluciones se basan en myLink.click())
  • Firefox (al menos 3.0, 3.5, 4.0): no existe la función click (esta es la razón por pseudo-soluciones basadas en myLink.click() no funcionan)
  • Firefox 5: la función existe click en Firefox 5, pero no cambia la ubicación de la ventana, por lo que todos los métodos que dependen de la existencia del método myLink.click() no funcionarán. Llamar a myLink.onclick() o myLink.onClick() produce un error ("onclick no es una función"), por lo que solutions based on these calls no funcionará.

Para gestionar estas cuestiones entre navegadores, estoy usando el siguiente método:

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

Esta solución funciona en todos los sabores y versión del navegador antes mencionados. Tiene la ventaja de ser simple, multi-navegador y fácil de entender. Tenga en cuenta que esto no se ha probado en HTTP S.

+2

Esto funciona muy bien a menos que desee usar method = "GET" y tenga parámetros url en su url. – six8

+0

@Cixate: verdadero para los parámetros de URL (he editado el código), pero no entiendo el argumento para el método de formulario ya que el método de formulario predeterminado es GET. –

+0

Lo siento, no estaba implicando que necesitabas el 'method = GET' en la etiqueta, solo decía que no podías usar parámetros en la URL si el formulario estaba usando el método GET. Pero la corrección de parámetros ocultos funciona muy bien. – six8

Cuestiones relacionadas