if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Dlaczego to nie zadziała? Otrzymuję pustą stronę.
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Dlaczego to nie zadziała? Otrzymuję pustą stronę.
Odpowiedzi:
Twój kod jest poprawny technicznie. Jeśli spojrzysz na nagłówki tej pustej strony, zobaczysz nagłówek 404, a inne komputery / programy będą w stanie poprawnie zidentyfikować odpowiedź jako nie znaleziono pliku.
Oczywiście Twoi użytkownicy nadal są SOL. Normalnie 404 są obsługiwane przez serwer WWW.
Problem polega na tym, że gdy serwer WWW zacznie przetwarzać stronę PHP, minął już punkt, w którym mógłby obsłużyć 404
Oprócz dostarczania nagłówka 404, PHP jest teraz odpowiedzialny za wyświetlenie rzeczywistej strony 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();
}
Jeśli spojrzysz na ostatnie dwie linie echa, zobaczysz tam zawartość. Możesz go dostosować, jak chcesz.
To jest poprawne zachowanie , to do Ciebie należy tworzenie treści dla strony 404.
Nagłówek 404 jest używany przez roboty i menedżery pobierania do określenia, czy plik istnieje.
(Strona z nagłówkiem 404 nie będzie indeksowana przez Google ani inne wyszukiwarki)
Jednak zwykli użytkownicy nie patrzą na nagłówki http i używają strony jako normalnej strony.
Dla przypomnienia, oto obsługa wszystkich spraw:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
die()
wymagane?
Załaduj domyślną stronę 404 serwera, jeśli taką masz, np. Zdefiniowaną dla Apache:
if(strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
readfile('404missing.html');
exit();
}
Od php 5.4 możesz teraz to zrobić http_response_code(404);
Kolejne rozwiązanie oparte na @ 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);
Jeśli programujesz witrynę internetową hostowaną na serwerze, nad którym nie masz kontroli, nie będziesz wiedzieć, który plik to „404missing.html”. Jednak nadal możesz to zrobić.
W ten sposób zapewniłeś dokładnie taki sam wynik jak normalna strona 404 na tym samym serwerze. Obserwator nie będzie w stanie odróżnić istniejącej strony PHP zwracającej 404 od nieistniejącej strony.
Nieco krótsza wersja. Tłumić dziwne echo.
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;
}
nigdy nie upraszczaj instrukcji echo i nigdy nie zapominaj średnika jak powyżej, także po co uruchamiać substrat na stronie, możemy łatwo uruchomić php_self
Robisz to dobrze, chociaż przydałoby się trochę rafinacji. Wygląda na to, że zostało to rozwiązane, więc porozmawiajmy o praktycznych zaletach aplikacji:
Nasza stara strona internetowa, która ma dużą kolekcję wielojęzycznej dokumentacji technicznej, wykonywała to wewnątrz warunku, jeśli inaczej:
if (<no file found>){
die("NO FILE HERE");
}
Problem (poza nieprzydatną wiadomością i złym doświadczeniem użytkownika) polega na tym, że zazwyczaj używamy robota indeksującego linki (w naszym przypadku integralności) do sprawdzania złych linków i brakujących dokumentów. Oznacza to, że otrzymywaliśmy idealnie poprawną odpowiedź 200 bez błędu, informującą nas, że jest tam plik. Integralność nie wiedziała, że spodziewamy się pliku PDF, więc musieliśmy ręcznie dodać nagłówek 404 za pomocą php. Dodając swój kod nad kostką (ponieważ nic później nie zostanie wykonane, a nagłówek i tak powinien zawsze znajdować się przed renderowanym kodem HTML), integralność (która zachowuje się mniej więcej jak przeglądarka) zwróciłaby 404 i wiedzielibyśmy dokładnie, gdzie szukać brakujących pliki. Są bardziej eleganckie sposoby poinformowania użytkownika o błędzie,
header('HTTP/1.0 404 Not Found');
die("NO FILE HERE");
Spróbuj tego:
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();
}
Wiesz, na mojej stronie stworzyłem coś takiego:
$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>");
}
Mam nadzieję, że Ci to pomoże.
Wpadłem na ten problem .. Myślę, że przekierowanie do nieistniejącego linku na twoim serwerze może załatwić sprawę! Ponieważ serwer zwróciłby jego 404:
header('Redirect abbb.404.nonexist');
<to na pewno nie istnieje
Jeśli chcesz wyświetlić domyślną stronę 404 serwera, możesz załadować ją w ramce takiej jak ta:
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';