if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Почему это не работает? У меня пустая страница.
На моем PHP-сервере он работает отлично. Вышеупомянутая строка возвращает страницу 404 сервера по умолчанию. Я предполагаю, что это можно настроить на сервере.






Это правильное поведение, вам решать создавать содержимое для страницы 404. Заголовок 404 используется пауками и менеджерами загрузки, чтобы определить, существует ли файл. (Страница с заголовком 404 не будет проиндексирована Google или другими поисковыми системами)
Однако обычные пользователи не смотрят http-заголовки и используют страницу как обычную страницу.
FWIW, в случае 404, IE возвращает свою стандартную страницу «не найден», если контент короткий (предполагается, что сервер просто говорит «не найден» и решает отобразить для пользователя более удобную страницу).
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, и другие компьютеры / программы смогут правильно идентифицировать ответ как файл, который не найден.
Конечно, ваши пользователи по-прежнему SOL. Обычно сообщения 404 обрабатываются веб-сервером.
Проблема в том, что как только веб-сервер начинает обрабатывать страницу PHP, он уже прошел точку, в которой он будет обрабатывать 404
Помимо предоставления заголовка 404, PHP теперь отвечает за вывод фактической страницы 404.
14-летняя девочка или нет, но этот маленький глупый диалог действительно имел для меня смысл.
Спасибо, сэр! Я наконец понял, почему PHP 404 работает, но не работает! :)) Я уже некоторое время боролся с этим.
Stack Overflow необходимо добавить функциональность к +1 для стиля. Это получит все +1.
Вот как должна быть написана документация! Особенно документация по Apache, которую я ненавижу :)
Больше ответов нужно писать так. +1 за диалог.
Почему php не может считывать документы по обработке ошибок и напрямую перенаправлять? Было бы так неприятно! Спасибо за ответ, дружище!
чертовски блестяще объяснено! сделал мой день!
На моем PHP-сервере он работает отлично. заголовок ('HTTP / 1.0 404 Not Found'); возвращает страницу 404 сервера по умолчанию. Я предполагаю, что это можно настроить на сервере.
@Yrrol - По какой-то причине это не помечено как ответ в?
Для всех людей, которые отмечают, что могут делать это на своем сервере. Nginx предоставляет параметр, который позволяет ему перехватывать состояние ошибки PHP и отправлять настроенную страницу ошибки. Он называется fastcgi_intercept_errors. Не уверен, что у apache есть эквивалентная настройка.
Немного укороченная версия. Подавить нечетное эхо.
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.");
}
Я столкнулся с этой проблемой .. Я думаю, что перенаправление на несуществующую ссылку на вашем сервере может помочь! Потому что сервер вернет его 404: header('Redirect abbb.404.nonexist'); <точно не существует
Если вы это сделаете, это также вернет 302. Лучше не перенаправляйте свои 404-е. вместо этого используйте код состояния 404 и отобразите сообщение «Не найдено».
Загрузите страницу 404 сервера по умолчанию, если она у вас есть, например определено для apache:
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
readfile('404missing.html');
exit();
}
он не работает, он показывает Предупреждение: readfile (404missing.html): не удалось открыть поток: нет такого файла или каталога в /var/www/.com/public_html/index1.php в строке 61
@AMB Это потому, что вам нужно создать этот файл самостоятельно.
@SuperCat спасибо, теперь я перечитал ошибку и теперь все ясно.,
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;
}
никогда не упрощайте эхо-операторы и никогда не забывайте точку с запятой, как указано выше, также зачем запускать substr на странице, мы можем легко просто запустить php_self
потому что REQUEST_URI - это не то же самое, что PHP_SELF. Особенно, если у вас есть переписывание URL.
Если вы хотите отобразить страницу 404 сервера по умолчанию, вы можете загрузить ее в таком фрейме:
echo '<iframe src = "/something-bogus" width = "100%" height = "100%" frameBorder = "0" border = "0" scrolling = "no"></iframe>';
Он должен получить какой-то значок за худший ответ, который я видел на этом сайте.
@MadTurki Есть намного хуже.
Для записи, это универсальный обработчик:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
Нет, просто поместите эти вещи в начало файла, а затем перейдите к настраиваемой странице 404.
Другое решение, основанное на @ Kitet's.
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, и несуществующую страницу.
Вы делаете это правильно, хотя это может потребовать некоторой доработки. Похоже, это уже решено, поэтому давайте поговорим о практических преимуществах приложения:
Наш старый веб-сайт с большой коллекцией многоязычной технической документации выполнял это внутри условного if else:
if (<no file found>){
die("NO FILE HERE");
}
Проблема (помимо бесполезного сообщения и плохого взаимодействия с пользователем) заключается в том, что мы обычно используем сканер ссылок (в нашем случае целостность) для проверки плохих ссылок и отсутствующих документов. Это означает, что мы получили совершенно правильный ответ 200 без ошибок, говорящий о том, что там был файл. Integrity не знала, что мы ожидали PDF-файл, поэтому нам пришлось вручную добавить заголовок 404 с помощью php. Добавив свой код над кристаллом (потому что впоследствии ничего не будет выполняться, а заголовок всегда должен быть перед любым визуализированным html), целостность (которая ведет себя более или менее как браузер) вернет 404, и мы будем точно знать, где искать отсутствующие файлы. Существуют более элегантные способы сообщить пользователю об ошибке, но, обслуживая ошибку 404, вы не только уведомляете браузеры и программы, подобные браузеру, об ошибке, но (я считаю, исправьте меня, если я ошибаюсь) также запись этих ошибок в журналы вашего сервера, где вы можете легко найти 404.
header('HTTP/1.0 404 Not Found');
die("NO FILE HERE");
Знаете, на своем сайте я создал что-то вроде этого:
$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>");
}
Надеюсь, это вам поможет.
попробуйте с:
header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');
До свидания!
Попробуй это:
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();
}
Лучшим вариантом было бы отправить статус 404 и сразу добавить свою пользовательскую страницу 404. Это то, что я делал раньше.