2010-10-17 15 views
5

Tengo una función que necesita redirigir la página si se establece una variable, etc. ...¿Redirigir PHP DESPUÉS de enviar encabezados?

El problema es que esta función se encuentra en la parte inferior de la página php.

Esto significa que he enviado mucha información, por lo que aparece una advertencia de encabezado.

"Advertencia - headers already sent by ..."

¿Hay alguna forma de redirigir después de los encabezados se envían?

Gracias

+0

Esto no es una cuestión de seguridad. Está haciendo 'print()' delante de 'encabezado()' o tiene una mezcla de etiquetas '' y ''. – rook

Respuesta

22

Lo que debe hacer es poner ob_start() en el comienzo mismo de su página, y ob_flush() al final. De esta forma no se encontrará con los encabezados que ya enviaron errores.

Ver those functions para más referencia.

+3

'ob_flush()' al final está implícito y se puede omitir. El beneficio de esto es que no volverá accidentalmente a este problema meses después si agrega contenido de salida después de 'ob_flush()' en algún lugar del flujo de control de su aplicación donde esa llamada a función no está visible. – eyelidlessness

+1

Esta es la solución más limpia de IMO; tenga en cuenta que esto funciona al almacenar en búfer los encabezados y el contenido y solo enviarlos todos juntos al final de la página. – Piskvor

+0

tampoco es que dependiendo del tamaño de su outpout y el número de visitas que tiene esta página exacta, realmente podría ralentizar su página debido al almacenamiento de todas las cadenas en la memoria. – ITroubs

12

hay formas, pero son básicamente soluciones:

La más simple es la meta http-equiv:

<meta http-equiv="Refresh" content="0;http://www.example.com/newlocation"> 
  • algunos navegadores no así cuando está fuera del elemento <head>, y caer en modo caprichos

O bien, puede intentar la redirección de JavaScript:

<script> 
    window.location = 'http://www.example.com/newlocation'; 
</script> 
  • que obviamente no funcionará sin JavaScript.
+0

'http-equiv' encabezados deben estar dentro de los primeros cientos de bytes del documento o el navegador no los tratará como encabezados HTTP. – eyelidlessness

+0

@eyelidlessness: Interesante, no lo sabía. [citation-needed]? – Piskvor

+0

@Piskvor, podría ser solo un legado. Tengo problemas para desenterrar cosas. Pero sí recuerdo la documentación de Microsoft que advierte específicamente a los desarrolladores que coloquen metaetiquetas equivalentes a HTTP en los primeros N bytes o que no sean tratados como encabezados. – eyelidlessness

Cuestiones relacionadas