Redirigir al navegador a una URL con ASP al detalle

  • Por
Notas interesantes sobre la utilización del método redirect del objeto response. Explicamos la razón de un posible error al utilizarlo y como evitarlo.
Nos ha llegado una consulta interesante que creo que no habíamos tratado con profundidad anteriormente. Se trata del método redirect del objeto response, que en determinadas situaciones da un error, que nos relataba un visitane de la siguiente manera:

Siempre trabaje en win2k e IIS para paginas ASP personales, pero ahora estoy en Win98 con PWS y las paginas que tenia funcionando en IIS con PWS me genera un error el Response.Redirect con el siguiente mensaje de error:

"Los enbezados HTTP ya están escritas en el explorador cliente. Cualquier cambio en el encabezado HTTP se debe hacer antes de escribir el contenido de la página."

Método redirect

Es un método del objeto response y sirve para mandar al navegador a una página que debe indicarse como parámetro. Un ejemplo de utilización sería:

response.redirect "tu_pagina.html"

Esto haría que nuestro navegador se situara en la página tu_pagina.html.

El redirect se realiza enviando en las cabeceras del HTTP la orden de redirección. El caso es que no se puede enviar nada en las cabeceras del HTTP si ya se ha empezado a escribir texto de la página web, aunque sea un simple espacio.

Por tanto, este código es incorrecto:

<head>
<title>Hola</title>
</head>
<%
    response.redirect "xxx.asp"
%>


Es incorrecto porque antes de hacer el redirect se ha escrito dentro de la página web, en este caso es información de cabecera, pero esta cabecera del documento HTML no es la mencionada cabecera del HTTP, que la mandan los servidores internamente sin que el programador participe activamente, salvo para introducir información como un redirect o un refresh a partir de funciones ASP.

Almacenamiento en buffer de la página

En instalaciones de ASP a partir de la 3.0 se utiliza un buffer de almacenamiento de la página que tiene como misión ir recogiendo el código HTML resultante de la ejecución de la página ASP, antes de mandarlo al cliente. El buffer se va llenando y cuando termina de ejecutarse la página se manda definitivamente por Internet hasta el ordenador del usuario.

La utilización del buffer en ASP 3.0 (IIS 5.0) se encuentra predeterminada, mientras que en otras versiones de ASP, como la del Personal Web Server (PWS), está predeterminado para no utilizarse.

Según se apunta entonces, en ASP 2.0 y anteriores se va enviando la página al cliente a medida que se va ejecutando y en ASP 3.0 hasta que no se termina de ejecutar entera, la página no se envía al cliente.

Así pues, el código anterior, donde se escribía en la página antes de ejecutar un redirect, aunque está mal diseñado en cualquier caso, puede dar error o puede no dar ningún error. Todo depende de si se había o no enviado texto al cliente previamente a la realización del redirect.

Todo esto tiene mucho que ver con el buffer, pues, si se está utilizando, no se envía nada al cliente y el redirect se realiza sin haber enviado texto, aunque sí se haya escrito en la página. Si no se utiliza el buffer el texto colocado antes del redirect sí se hubiese enviado al cliente y al ejecutar el redirect aparecería el error que nos comentaba nuestro lector.

Utilización o no del buffer

Para indicar que se desea utilizar el buffer hay que escribir esta sentencia al principio del código ASP.

response.buffer = true

Si se coloca en ASP 3.0 no sirve para nada, porque esa opción ya estaba predeterminada. Pero, en cualquier caso, no molesta y nos aseguramos que se utilizará el buffer si las páginas se trasladan a un servidor con ASP 2.0.

Si deseamos hacer un redirect después de haber escrito texto en el buffer, lo correcto sería ejecutar estas dos sentencias juntas:

response.clear response.redirect "http://www.loquesea.com"

La primera línea indica que se debe vaciar el buffer, con lo que se elimina lo que se haya escrito en la página, y la segunda indica que se haga la redirección. Insisto, esto sólo es posible si se está utilizando el buffer.

Referencias: La sentencia redirect se utiliza en muchos ejemplos dentro de DesarrolloWeb, pero se explica en el artículo Objeto response. Este artículo se engloba, junto con otros artículos de ASP básicos, en el manual Programación en ASP.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Nico

15/4/2005
Y como se haria para redireccionar una pagina pero a un frame determinado? (o sea, no a una pagina nueva, sino redireccionar desde un frame a otro frame dentro de la misma pagina)
Aclaracion: Response.redirect no maneja frames !!!

RESPUESTA

Redirect en ASP no te va a servir si quieres redireccionar otro frame. Lo tendrías que hacer mediante Javascript.

Para redireccionar con Javascript tienes la sentencia window.location="nueva_url". Pero si deseas redireccionar otro de los frames de la página, primero tienes que hacer referencia al frame en concreto que quieres cambiar.

Para saber cómo referenciar y trabajar con distintos frames en Javascript, te recomiendo la lectura del manual Control de frames con Javascript.

diego

24/8/2007
Amigos estoy usando el metodo response para abrir otra pagina pero el problema q tengo es que se carga en el mainFrame y el topFrame no cambia, y yo necesito que se cargue en toda la pagina, hay alguna forma de conseguir eso, muchas gracias

Luis

05/4/2011
Consulta
Estoy haciendo Response.Redirect con asp.net y sucede que luego de reenviar el a otra pagina, vuelvo a mi paginma de origen y cada vez que presiono un boton, nuevamente me lleva la pagina que habia enviado en un principio, es como si todos los botones quedaran redireccionados al la otra pagina.

Gracias por tu respuesta.

Javier

17/1/2014
En mi caso, necesidad de un False
Muchas gracias, Miguel Ángel
En mi clase base de la página incluyo la linea Response.Buffer = True
Y antes del redirect
Response.Clear()
Pero en la redirección he tenido que añadir un parámetro False, para que no siga cargando la página, ya que sino me seguía dando error.
Response.Redirect(url, False)

Un saludo y gracias
Javier De Usera R.