if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Почему это не работает? Я получаю пустую страницу.
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Почему это не работает? Я получаю пустую страницу.
Ваш код технически корректен. Если вы посмотрите на заголовки этой пустой страницы, вы увидите заголовок 404, и другие компьютеры/программы смогут правильно идентифицировать ответ, поскольку файл не найден.
Конечно, ваши пользователи все еще SOL. Обычно 404s обрабатываются веб-сервером.
Проблема заключается в том, что, как только веб-сервер начинает обрабатывать страницу PHP, он уже прошел точку, где он будет обрабатывать 404
В дополнение к предоставлению заголовка 404, PHP теперь отвечает за вывод фактической страницы 404.
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
echo "<h1>404 Not Found</h1>";
echo "The page that you have requested could not be found.";
exit();
}
Если вы посмотрите на две последние эхо-строки, где вы увидите контент. Вы можете настроить его, как хотите.
Это правильное поведение, это зависит от вас, чтобы создать содержимое страницы 404.
Заголовок 404 используется пауками и менеджерами загрузки, чтобы определить, существует ли файл.
(Страница с заголовком 404 не будет проиндексирована Google или другими поисковыми системами)
Обычные пользователи, однако, не смотрят на http-заголовки и не используют страницу как обычную страницу.
Для записи это обработчик для всех случаев:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
Загрузите страницу 404 сервера по умолчанию, если она есть, например. для apache:
if(strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
readfile('404missing.html');
exit();
}
Так как php 5.4 теперь можно сделать http_response_code(404);
Другое решение, основанное на @Kitet.
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);
Если вы программируете веб-сайт, размещенный на сервере, у вас нет контроля, вы не будете знать, какой файл является "404missing.html". Однако вы все еще можете это сделать.
Таким образом, вы предоставили точно такой же результат нормальной 404 страницы на том же сервере. Наблюдатель не сможет отличить существующую PHP-страницу от возвратов 404 и несуществующую страницу.
попробуйте:
header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');
Bye!
Немного короче. Подавить нечетное эхо.
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}
if($_SERVER['PHP_SELF'] == '/index.php'){
header('HTTP/1.0 404 Not Found');
echo "<h1>404 Not Found</h1>";
echo "The page that you have requested could not be found.";
die;
}
никогда не упрощайте инструкции эха и никогда не забывайте о том, что такое двоеточие, например выше, также зачем запускать субстрат на странице, мы можем просто запустить php_self
Если вы хотите, чтобы страница ошибок по умолчанию сервера отображалась, вам необходимо обработать ее на сервере.
Вы делаете это правильно, хотя он может использовать некоторые уточнения. Похоже, что это было рассмотрено, поэтому давайте поговорим о практических преимуществах приложения:
Старый веб-сайт, у которого есть большая коллекция многоязычных технических документов, выполнял это внутри if if условно:
if (<no file found>){
die("NO FILE HERE");
}
Проблема (помимо бесполезного сообщения и плохой пользовательский опыт) заключается в том, что мы обычно используем искатель ссылок (в нашем случае целостность), чтобы проверить плохие ссылки и недостающие документы. Это означает, что мы получили совершенно корректный ответ на ошибку 200, сообщающий нам, что там был файл. Целостность не знала, что мы ожидаем PDF, поэтому нам пришлось вручную добавить заголовок 404 с php. Добавив свой код над штампом (потому что после него ничего не будет выполнено, и заголовок всегда должен быть до любого отображаемого html), целостность (которая ведет себя более или менее как браузер) вернет 404, и мы точно знаем, где искать отсутствующие файлы. Есть более элегантные способы сообщить пользователю, что есть ошибка, но, слушая ошибку 404, вы не только уведомляете браузеры и браузерные программы об ошибке, но (я считаю, что верьте мне, если я ошибаюсь) также записывая эти ошибки в ваших журналах сервера, где вы можете легко grep для 404s.
header('HTTP/1.0 404 Not Found');
die("NO FILE HERE");
Попробуйте следующее:
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
echo "<head><title>404 Not Found</title></head>";
echo "<h1>Not Found</h1>";
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
echo "<p>The requested URL ".$uri." was not found on this server.</p>";
exit();
}
Знаете, на моем сайте я создал что-то вроде этого:
$uri=$_SERVER['REQUEST_URI'];
$strpos=strpos($uri, '.php');
if ($strpos!==false){
$e404="The page requested by you: "".$_SERVER['REQUEST_URI']."", doesn't exists on this server.";
$maybe=str_replace('.php','',$uri);
$maybe=str_replace('/','',$maybe);
die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");
}
Надеюсь, это поможет вам.
Я подошел к этой проблеме. Я думаю, что перенаправление на несуществующую ссылку на вашем сервере может сделать трюк! Потому что сервер вернет свой 404: header('Redirect abbb.404.nonexist');
< это точно не существует
Если вы хотите показать страницу 404 по умолчанию сервера, вы можете загрузить ее в таком кадре, как это:
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';