The 'redirect' is a header, and it does not have to be sent before the headers are sent, it must be sent before anything that is not a header is sent.
There are two ways to do it properly.
a) make sure the redirect is always the first thing that is outputted
b) use output buffering to buffer all the output of your script until the script is finished. This helps because when you call the function to print the buffer, it first find all the headers and puts them at the top before it sends the data.
ob_start();
// print whatever you want
ob_end_flush();
Just make sure your script doesn't build an entire web-page before it decides to redirect, that's just wasting resources.
A forum, a FAQ, email notification, what else do you need?