How to fetch the actual request URL in Apache/PHP

2019-08-31 04:23发布

问题:

I want to fetch the actual URL of the request made by the client, how do I do that? I mean if someone requests a page that does not exists, like, http://localhost/invalid.php, and I have set 404 custom error file to http://localhost/test.php, then how do I get to know what was the actual URL requested by the user.

I have tried this in IIS7. I have set the Custom Error Page to /test.php, and whenever the user requests a URL which does not exist, I could still access that URL using $_SERVER['REQUEST_URI'] in /test.php and the URL in browsers still remains the same.

But I am having problem doing the same in Apache. I have set the Custom Error Page to /test.php but when user requests a page which doesn't exist, the user is redirected to a /test.php and I cant access the actual URL which the user requested. I've tried this print_r($_SERVER) but did not find the actual request URL any where in the $_SERVER array.

回答1:

I believe you could do it by using a RewriteCond rather that an error 404.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ test.php?errpath=$1

The first line checks if the file actually exists.
The second routes the client to test.php.

Then in test.php you put something like:

<?php
    if ($_GET['errpath'] == "" || $_GET['errpath'] == "/") {
        require("index.php");
    }
    else {
        echo "The url ".$_GET['errpath']." does not exist.";
    }
?>

That checks if errpath is nothing or just a forward slash (meaning the client would normally be showed index.php), and is so, requires it. Otherwise do whatever you want for the 404 error page.

P.S. Sorry if the explanations seem patronizing, I just hate it when people tell me to do something and I don't understand. I don't want to do that to anyone else.