Technically speaking, you should do three things. a) Send a location header, b) send the meta tag and c) include a hyperlink...Using the Locaion: header causes a 302 Found to occur. Here is what W3C has to say about 302s:
10.3.3 302 Found
The requested resource resides temporarily under a different URI.
Since the redirection might be altered on occasion, the client SHOULD
continue to use the Request-URI for future requests. This response
is only cacheable if indicated by a Cache-Control or Expires header
field.
The temporary URI SHOULD be given by the Location field in the
response. Unless the request method was HEAD, the entity of the
response SHOULD contain a short hypertext note with a hyperlink to
the new URI(s).
I use this function for redirection, which must be called before headers are sent:
//Redirect: takes a url and writes a re-direct page...starting with header redirect, then a meta tag, and finally a link:
//Note: no actuall data can be sent before this, or header update will fail
function redirect($url) {
header("Location: $url");
print "<head><meta http-equiv=\"Refresh\" content=\"0; URL=$url\"></head><body>If your browser does not forward you, <a href=\"$url\">click here</a>.</body>";
}
Netscape 3 Windows, for instance, does not listen to the "Location:" header but does (I think) respect meta refresh tags...if all else fails, you have a hyper-link so your user will never be stranded. Note that sending body content AFTER the header isn't a problem, furthermore, most browsers will forward the user without bothering to render the page. Hope this helps.