Пользовательская страница 404 - PHP
У меня есть пользовательская страница 404, которая отлично работает, за исключением сообщения, которое я хочу отобразить на этой странице.
Я хотел бы сказать URL страницы, которая не может быть найдена, но вместо этого она отображает URL страницы 404.
Вот что у меня есть...
You were looking for <?php echo $_SERVER['REQUEST_URI'] ?>.
Файл htaccess содержит строку: ErrorDocument 404 /404/
5 ответов
Вам нужно использовать $_SERVER['HTTP_REFERER']
вместо этого - это будет адрес, который они запросили первым.
Это работает только в точном случае, описанном в вопросе - где браузер был фактически перенаправлен на страницу 404. В этой ситуации $_SERVER['REQUEST_URI']
содержит URI страницы 404, а не первоначально запрошенную страницу, как описано.
Используя Apache's 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? В идеале я бы отображал 404 прямо на странице, которая не была найдена. Таким образом, вам не нужно перенаправлять, и вы можете правильно использовать REQUEST_URI. И код для вашего 404 все еще может быть централизованным!
Используйте file_exists, чтобы проверить, существует ли файл, который ищет ваш пользователь, или нет. если это не перенаправить их на пользовательскую страницу ошибки.