У меня есть пользовательская страница 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
и другие, поэтому обрабатывайте их перед выводом чего-либо.
Не видел сообщение от @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, чтобы проверить, существует ли файл, который ищет ваш пользователь, или нет. если он не перенаправляет их на страницу сделанных пользователем ошибок.