2008-10-28 81 views
7

Estoy usando Response.Redirect para redirigir a los usuarios a otro servidor para descargar un archivo, y el otro servidor está revisando el encabezado para asegurarse de que proviene del servidor correcto ... sin embargo, parece que Response.Redirect quita los encabezados de la respuesta.Response.Redirect strips Referente del encabezado: ¿es posible volver a agregarlo?

¿Alguien sabe cómo puedo agregar los encabezados? Lo he intentado:

Response.AddHeader("Referer", "www.domain.com"); 

Pero la página de recepción prueba falsa cuando compruebo si el encabezado Referrer está configurado.

Cualquier sugerencia sobre cómo puedo hacer que funcione, aparte de mostrar un botón para que el usuario haga clic en (me gustaría mantener la URL oculta para el usuario tanto como sea posible).

Respuesta

1

No creo que sea posible. Lo que está enviando al cliente es un encabezado de ubicación que le dice al cliente que cargue la página referida en lugar de la página que solicitó originalmente. En este caso, el cliente no proviene de un enlace y, por lo tanto, no establece el encabezado de referencia. Básicamente es como si el usuario escribiera la url de redirección en la barra de direcciones de su navegador.

Puede guardar la referencia en la sesión o codificarla en la URL como parámetro de consulta. Al igual que los formularios, el inicio de sesión hace con ReturnUrl.

1

¿Es Server.Transfer una opción?

Aunque hay algunas advertencias que deberá tener en cuenta. E.G. Conserva la URL original, la Autorización, etc. Más detalles en el enlace.

Guardar la URL original puede ser ventajoso en esta circunstancia.

+1

Server.Transfer es solo una opción cuando está en el mismo servidor, ¿correcto? En este caso, necesito redirigir a un servidor diferente, por lo que probablemente no vaya a funcionar :( – Jeeby

+0

Correcto - Mismo servidor ... –

+0

ahh bien, no ser entonces – Jeeby

2

El encabezado de referencia que recibe su segundo servidor lo genera el navegador y es poco probable que pueda cambiarlo de manera sensata.

¿Intentó agregar el referidor a la URL y luego leer eso en su segundo servidor?

Response.Redirect("url?Referer=" + Server.UrlEncode(Request.UrlReferrer)); 
0

Establecer una cookie de autenticación (con una clave hash y una espiración 5 minutos), enviar una respuesta de redirección, el navegador envía una nueva solicitud al segundo servidor (si es el mismo dominio) junto con el coookie auth , el segundo servidor verifica la cookie, se asegura de que solo el primer servidor pueda haberlo configurado y devuelve el contenido al navegador.

3

que irá contra El árbitro (sic) cabecea definition:

El árbitro [sic] campo de petición-cabecera permite al cliente especificar, para el beneficio del servidor , la dirección (URI) de el recurso del que se obtuvo la Request-URI (la "referencia" , aunque el campo de cabecera está mal escrito.)

Si está redirigiendo, este no es el caso para agregar este encabezado.

Si necesita esta información, intente con una cookie o alguna variable de sesión, o incluso una variable en la URL como ya le han dicho.

0

Si la redirección es para el mismo proceso, utilizaría un valor de sesión para almacenar el URI de referencia para permitir que la página secundaria lo recoja. Lo uso en mi sistema para mantener la referencia entre la redirección de las conexiones http a nuestro sistema https.

+0

¿Qué sucede si el usuario hace dos solicitudes al mismo tiempo? lo sé, es casi imposible que suceda, pero quién sabe ... –

+0

Es una buena pregunta. Sospecho que la segunda solicitud sobrescribirá el valor de la sesión ["referente"] que he creado, sin embargo, mi código ya habrá almacenado el primera solicitud en una tabla DB, así que todavía tengo para fines de informes, pero exagerado en este escenario. – Lazarus

9

Hay un truco de HTML disponible.

<form action="http://url.goes.here" id="test" method="GET"></form> 
<script type="text/javascript"> 
    document.getElementById("test").submit(); 
</script> 

Si necesita que determina la aparición de un código subyacente, que puede hacerse demasiado:

Response.Write(@"<form action='http://url.goes.here' id='test' method='GET'></form> 
        <script type='text/javascript'> 
        document.getElementById('test').submit(); 
        </script> "); 

Como Inkel podría señalar, que es una interpretación libre de la especificación Referer [sic]. Hará lo que quieras sin embargo.

+0

Sí, eso es lo único que funcionó para mí en IE7 y FF3 – EMP

+0

que necesita para escapar el '" 'en su C# – Liam

-2

+1 al comentario anterior de inkel.

Aunque si no le importan las especificaciones y solo quiere hacerlo de todos modos, puede evitar el uso de Response.Redirect y, en su lugar, crear los encabezados de las respuestas usted mismo.

Response.StatusCode = 302; //temp redirect 
Response.Headers.Add("Location", "your/url/here"); 
Response.Headers.Add("Referer", "something.com"); 
Response.End(); 

Esto está fuera de mi cabeza, es posible que deba tener algunas otras cosas en el encabezado de respuesta.

+1

- 1 'Referer' es un encabezado Request, no un encabezado Response. –

1

Aquí es una versión del anterior que funciona para mí:

default.asp 

servername = Lcase(Request.ServerVariables("SERVER_NAME")) 
Response.Status = "301 Moved Permanently" 
Response.AddHeader "Location", "http://yoursite" 
Response.AddHeader "Referer", servername 
Response.End() 
0

No sugiero para publicar - la mayoría de los sitios web que bloquean. solo use javascript document.location = '<%:yourURL%>;'; que cargará automáticamente la página nueva. esto está funcionando bien para mí, porque la respuesta de redireccionamiento no incluye referencia.

1

Sé que esto es viejo, pero acabo de encontrarlo mientras trato de hacer algo similar.

No quería agregarlo a la URL ya que algo contaminaba la URL con cosas que no quería allí. Además, no quería que las personas marcaran accidentalmente esa URL. Por lo tanto, utilicé Cookies para agregar mis datos;

string token = vwrApi.GetAuthenticationToken(userId); 
Response.Cookies.Add(new HttpCookie("VwrAuthorization", token)); 
Response.Redirect(returnUrl, true); 

Por supuesto, esto depende de su capacidad para cambiar el lugar en el servidor de destino busca la información, pero es otra opción, al menos.

-1

Deberá emitir una respuesta de estado 307 y establecer el encabezado de ubicación en el destino al que desea que se redirija al usuario. Esto mantendrá intacto el encabezado original del referer [sic].

HttpContext.Current.Response.StatusCode = 307; 
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com"); 
HttpContext.Current.Response.End(); 
+1

Esto no funciona de la manera que corresponde a la pregunta.La solicitud redirigida no tiene la cadena de referer esperada (aunque ya lo dijiste). – Marcel

Cuestiones relacionadas