Quantcast
Channel: Active questions tagged header - Stack Overflow
Viewing all articles
Browse latest Browse all 649

Showing error pages when sending header with header() function

$
0
0

I want to send some response codes in response (what else?) to various conditions.

The header is being sent - I tripped over the various errors you can make using header(), such as having output before the call before. I figured out those sort of issues, for instance, I now use ob_start() and ob_clean() before the header() function call.

Now I need to understand why my browser/server/whatever is not showing me an error page.

Here's the HTML page which I'm using for testing:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html lang="en"><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Header Testing</title></head><body><?php     error_reporting(E_ALL);     ini_set('display_errors', '1');     ob_start();     ob_clean();     header("HTTP/1.1 403 - Forbidden", true, 403); // I get the same results with or without "true, 403"     ob_flush();?>

Here's the header from the access log:

127.0.0.1 - - [11/Feb/2012:19:14:35 -0600] "POST /commentprocessing.php HTTP/1.1" 403 266 "http://127.0.0.1/submitcomments.php""Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 ( .NET CLR 3.5.30729; .NET4.0C)"

Here is the HTML source:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html lang="en"><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Header Testing</title></head><body></body></html>

That is exactly what I'd get if I removed out the PHP code from the test page.

Is there any way to have an "error" page display automatically based on the return code in the header?

I am running Abyss server locally for this sort of testing. I have a custom error page defined in Abyss for 403 errors and I've checked that it is spelled correctly in the Abyss setup and the page actually exists.

That page is not being displayed for the header with the 403 response code - which seems to be sent properly since it shows in the access log.

Could this be an issue with my using Abyss locally and not the server of my hosting company?

Any suggestions?

EDIT***

tftd,

If what you said is true, that the server is ignoring my code, why is it logged in the access log with the code I specified?

And, if what you said about being unable to change the response code, why even have the header() statement OR why does not the documentation clearly point out that such as things as using ob_start() and ob_clean() won't resolve get around it.

I've see, in more than one place, references to using ob_start() and ob_clean() to delete generated output so that the header() call will work.

heera,

Thank you, at least for showing me that material can be placed above the doctype statement and still be effective. I would not have thought that would work. So, thank you for that.

However, your example merely outputs exactly what would be output if you stripped out all of the PHP and had just the HTML.

I have removed your onload call to eliminate the 'function not defined' error which would have occurred since you did not include a script containing the referenced function.

The following will produce the same output as your example:

<!DOCTYPE html><html><head></head><body>This is some text</body></html>

Here's your example, which produces the same output as the straight HTML above.

<?php ob_start();?><!DOCTYPE html><html>   <head></head>><body>This is some text</body>></html><?php$ob=ob_get_clean();echo $ob;ob_end_flush(); ?>

You take a convoluted journey to the same output.

Also, why get the contents of the buffer and turn around and echo it out? What does that demonstrate other than a call to ob_get_clean() returns the contents of the buffer, erases it, and, unlike ob_clean(), deletes the buffer and if you want to send the output you just erased, you have to use ob_get_clean() and save it and then use echo to write it out.

Doesn't that just demonstrate that you had better do something to save the contents of the buffer, if you want to output, before calling a clean function?

And, ob_end_flush() is documented, everywhere I've encountered it, as being automatically called went the script/page finishes. Why demonstrate something that happens automatically, unless you were showing that with our with out a flush call, of one type or another, results in the same output, provided additional out is not created after the flush call.

Seems like your ob_end_clean() call doesn't demonstrate anything at all, hmmm, or does it?

So, why generate output, get it from the buffer, erase and delete the buffer, and then output the contents you saved? What exactly, does that demonstrate? How to do something simple in a convoluted, strange way?

Now, if you wanted to demonstrate the difference the placement of the ob_start() makes on the output and that ob_clean() deletes previous output, why not start with an example like this:

<?php ob_start();?> <!DOCTYPE html><html><head></head><body>This is some text</body></html><?phpob_clean(); // erase output bufferecho "It was the best of times, it was the worst of times."?>

The only output from that would be

It was the best of times, it was the worst of times.

If you comment out the ob_clean() call:

<?php ob_start();?><!DOCTYPE html><html><head></head><body>This is some text</body></html><?php//ob_clean(); // erase output bufferecho "It was the best of times, it was the worst of times."?>

The output is now:

<!DOCTYPE html><html><head></head><body>This is some text</body></html>This is some textIt was the best of times, it was the worst of times.

If you take my original example and move the ob_start() down into the second piece PHP code, like this:

<!DOCTYPE html><html><head></head><body>This is some text</body></html><?phpob_start();ob_clean(); // erase output bufferecho "It was the best of times, it was the worst of times."?>

The output is:

<!DOCTYPE html><html><head></head><body>This is some text</body></html>This is some text It was the best of times, it was the worst of times.

Those are the examples I would provide to show the effect of the placement of the ob_start() and ob_clean() calls.

Again your example does exactly what the HTML would do were the PHP not there.

If you were saying that you must use ob_start, ob_get_clean(), echo, and ob_end_flush() to produce output - well, I would expect that from a programmer who only knew about ob_get_clean() and ob_end_flush().

I'd expect that from a programmer who, for some reason, thought he or she had to take charge to get the output to the user; that they had to take the buffer contents and use echo to send it to the user.

I simply don't understand why your wrote that example as you did or what, besides placement of the ob_start(), you were trying to demonstrate.

As for the "real world" - in the real world programmers are expected to understand the language features they use and any alternatives to them. They are expected to understand concepts - such as PHP automatically sending any generated output without the programmer having to call a function to get it to the user.

You called my use of buffering wrong. Well, it was, as regards the placement of the ob_sat() call, but everything else is just fine.

If you had posted your example in a question of some sort, my reply would have been -

There is absolutely no need to use an PHP to achieve what you are tyring to do. Take out the PHP and use the straight HTML - the output will be the same.

I'm sorry, but that example, except for the ob_start placement, demonstrates nothing but a strange and convo9luted way to get a HTML to a user.

Perhaps you just didn't take the time to consider the best example to use, after, first deciding what the example was to demonstrate.

If we ignore that fact that the example does nothing that the straight HTML does and it goes about outputting the buffer in a convoluted way, all your example did was set me straight on one thing - you can put something before the doctype and it will be "processed. And I thank you for pointing that out to me.

mc_kennedy,

I read the page you pointed me at but I don't think that applies since the first line of output does no start with HTTP/, as the page specifies.

I'm basing that on what I see in the source view window in my browser. The first line is either the doctype or a

To everyone in general --

It seems that what is being said, by some people, is that you have to have the header() call at the very top of the file and that will allow you to send response codes correctly.

Well, I tried that, with the PHP at the very top and followed by standard HTML, and I don't see any difference.

Am I wrong is thinking that a server will react differently to, say, a 200 than to a 403?

Do I have this all wrong and what I'm expecting - to have the server react, somehow, to the 403 or 500 error - is simply something that does not exist?

If the approach I was using would cause the header() call to be ignored, why does the log show the code I was sending?

I now understand that I should generate the error pages myself, I suspected (well, more than suspected, more like figured that was required.)

But am I expecting a server to react to different responses codes in different ways and this simply does not happen?

Bob


Viewing all articles
Browse latest Browse all 649

Trending Articles