Re: Apache 1.3x/PHP 5.0.3 404 error handler & posted data...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Raymond C. Rodgers wrote:
> I'm trying to write an error handler in PHP to try to avoid sending the
> browser a 404 error message. Basically, if someone
> requests /whatever.html on the server and it doesn't exist, my 404 error
> handler checks to see if /whatever.php exists, if so, it then includes
> that file.
> 
> That part works fine.
> 
> The part that I'm having trouble with is if /whatever.html happens to be
> the target of a form POST. With GET requests, the data is available in
> either $_SERVER['REDIRECT_QUERY_STRING'] or (worst case)
> $_SERVER['REQUEST_URI']. That's easy enough to parse and turn into
> $_REQUEST and/or $_GET. However, it seems that POSTed data just vanishes
> into thin air. $_POST is not set, of course, and I've been trying to
> read data using file_get_contents('php://input') but nothing is
> returned... Is this a bug in PHP, Apache, not a bug but an unimplemented
> feature, security precaution, or what? Am I missing something simple to
> get the POSTed data?

No, you can't do what you are trying to do the way you are trying to do
it.  Apache changes the original POST to a GET request on the internal
errordocument redirect so PHP can't get at the original posted data.
Well, it probably could with some hacking, but the web server has
specifically told us that this is not a POST request anymore, so we
respect that.

With Apache2 you could use Multiviews to do this by setting PHP up as a
handler and telling Apache that it returns type text/html (we don't do
this by default because PHP doesn't always return text/html) and then
let multiviews take care of turning your request for /whatever.html into
a real request for /whatever.php.  And the POST data would be intact.

For Apache1 you could probably use a type-map file.  Have a read through
http://httpd.apache.org/docs/content-negotiation.html

A better option may be to just use mod_rewrite.  Something along the
lines of:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.html$  $1.php [T=application/x-httpd-php,L]

You should verify this with the mod_rewrite docs, but this should only
rewrite a request for whatever.html to whatever.php if whatever.html
doesn't exist.  I suppose you could also add a condition to only do the
rewrite if $1.php exists.

-Rasmus

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux