Пользовательская страница 404 - PHP - PullRequest
12 голосов
/ 14 апреля 2011

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

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

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

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

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

Ответы [ 5 ]

12 голосов
/ 14 апреля 2011

Вместо этого вам нужно использовать $_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.

7 голосов
/ 14 апреля 2011

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

1 голос
/ 22 апреля 2011

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

    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()); ?>
0 голосов
/ 20 апреля 2011

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

0 голосов
/ 14 апреля 2011

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

...