The Surrican
The Surrican

Reputation: 29874

Why does this header location redirect work after content has already been echoed?

<?
echo "lalala";
header("Location: http://www.google.com/");

If i put this in a plain php file and deliver over a standard apache2 server with mod-php (PHP Version 5.3.2-1ubuntu4.10) the redirect to google works.

<?
echo "lalala";
flush();
header("Location: http://www.google.com/");

this code does obviously not produce a working redirect.

My question is how the first code is beeing processed and why it works. Because I remember times when things like this were not possible. Is mod-php or apache intelligent enough to buffer the whole request and arrange headers before content?

And:

Can I rely on this if I make sure I don't flush the output manually? Because it would make my application much easier...

Upvotes: 3

Views: 1057

Answers (2)

Alfabravo
Alfabravo

Reputation: 7589

The header function ADDS an http common header to the HTTP response. So, the redirect is setted and the browser gets the 302 message before showing you the output.

flush orders php to send the http response already prepared at the point it is called. That's why the second code won't set the header (it must be setted before sending ANY output).

And, the PHP should not output a single thing until:

  • The script is processed (even if an error stops the parsing)
  • you set it to send the output somewhere in the script with flush()

Finally, check this on output control http://www.php.net/manual/en/intro.outcontrol.php

Upvotes: 2

diolemo
diolemo

Reputation: 2671

Output buffering is probably enabled by default. You should enable it manually if you want to rely on this functionality.

http://php.net/manual/en/function.ob-start.php

Upvotes: 7

Related Questions