Пользовательская страница 404 – PHP

У меня есть пользовательская страница 404, которая отлично работает, за исключением сообщения, которое я хочу отобразить на этой странице.

Я бы хотел, чтобы он сказал url страницы, которая не может быть найдена, но вместо этого отображает URL страницы 404.

Вот что у меня есть …

You were looking for <?php echo $_SERVER['REQUEST_URI'] ?>.

Файл htaccess содержит строку: ErrorDocument 404 /404/

Вместо этого вам нужно использовать $_SERVER['HTTP_REFERER'] – это будет тот адрес, который они запросили в первую очередь.

Это работает только в конкретном случае, описанном в вопросе, – где браузер фактически перенаправлен на страницу 404. В этой ситуации $_SERVER['REQUEST_URI'] содержит URI страницы 404, а не первоначально запрошенную страницу, как описано.

Использование Apache ErrorDocument 404 /handle404.php в конфигурации сайта или .htaccess означает, что $_SERVER['REQUEST_URI'] действительно будет работать, но более надежным решением является вариант в обновлении ниже.

Обновить:

По-видимому, $_SERVER['REDIRECT_URL'] может быть лучше, если обыскать немного.

В обоих случаях, как отмечают комментаторы ниже, имейте в виду, что любые заголовки настолько же подвержены вредоносному контенту, что и $_POST , $_GET и другие, поэтому обрабатывайте их перед выводом чего-либо.

Обновление 2:

Не видел сообщение от @Janoz ниже – он правильно упоминает REDIRECT_URL .

С точки зрения php-страницы, это действительно запрос uri. Отображение страницы ошибки выполняется на веб-сервере. Например, Apache добавит дополнительные серверные переменные. REDIRECT_URL, вероятно, тот, который вы ищете.

Я не писал эту функцию, но это то, что я использую, чтобы сделать то же самое:

  function selfURL() { $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]); return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']; } function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); } 

затем распечатать его:

 <?php print(selfURL()); ?> 

Если страница не существует, вы перенаправляете его на страницу 404? Idealy, я бы отобразил 404 непосредственно на странице, которая не была найдена. Таким образом, вам не нужно перенаправлять, и вы можете правильно использовать REQUEST_URI. И код для вашего 404 все еще может быть централизован!

используйте file_exists, чтобы проверить, существует ли файл, который ищет ваш пользователь, или нет. если он не перенаправляет их на страницу сделанных пользователем ошибок.