PHP uygulamam neden 404 hatası göndermiyor?


140
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

Neden bu işe yaramayacak? Boş bir sayfa alıyorum.


1
Daha iyi bir seçenek, 404 durumu göndermek ve özel 404 sayfanızı hemen eklemek olabilir. Eskiden ben de öyle yapıyordum.
Rocky

PHP sunucumda mükemmel çalışıyor. Yukarıdaki satır sunucunun varsayılan 404 sayfasını döndürür. Bunun sunucuda yapılandırılabileceğini düşünüyorum.
Elmue

Yanıtlar:


306

Kodunuz teknik olarak doğrudur. Bu boş sayfanın başlıklarına bakarsanız, bir 404 başlığı görürsünüz ve diğer bilgisayarlar / programlar yanıtı dosya bulunamadığı gibi doğru bir şekilde tanımlayabilir.

Tabii ki, kullanıcılarınız hala SOL. Normalde, 404'ler web sunucusu tarafından işlenir.

  • Kullanıcı: Hey, bu URI web sunucusunda benim için bir şey var mı?
  • Web sunucusu: Hayır, bilmiyorum, 404! İşte 404'ler için görüntülenecek bir sayfa.

Sorun, web sunucusu PHP sayfasını işlemeye başladığında, 404'ü işleyeceği noktayı zaten geçti.

  • Kullanıcı: Hey, bu URI web sunucusunda benim için bir şey var mı?
  • Web sunucusu: Evet, biliyorum, bu bir PHP sayfası. Yanıt kodunun ne olduğunu söyleyecektir
  • PHP: Hey, OMG 404 !!!!!!!
  • Web sunucusu: Tamam, 404 sayfalık insanlar zaten eve gitti, bu yüzden PHP'nin bana verdiği her şeyi göndereceğim

Bir 404 üstbilgisi sağlamanın yanı sıra, PHP artık gerçek 404 sayfasının çıktısından sorumludur.


49
14 yaşındaki kız ya da değil, küçük sevimsiz iletişim gerçekten bana mantıklı geldi.
rbwhitaker

20
PHP oldu 14 o zamanlar
Adam Lynch

1
Yığın Taşması stil için + 1'e işlevsellik eklemelidir. Bu tüm + 1'leri alacaktı.
Jay Querido

30
Dokümantasyon bu şekilde yazılmalıdır! Özellikle gerçekten nefret ettiğim Apache belgeleri :)
Harry

4
kanlı zekice açıkladı! günümü şenlendirdin!
Andrei Cristian Prodan

78
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();
}

Son iki yankı çizgisine bakarsanız, içeriği burada görebilirsiniz. İstediğiniz gibi özelleştirebilirsiniz.


74

Bu doğru davranış , 404 sayfasının içeriğini oluşturmak size kalmış.
404 üstbilgisi, dosyanın var olup olmadığını belirlemek için örümcekler ve indirme yöneticileri tarafından kullanılır.
(404 başlığı olan bir sayfa google veya diğer arama motorları tarafından dizine eklenmez)

Ancak normal kullanıcılar http başlıklarına bakmaz ve sayfayı normal sayfa olarak kullanmaz.


20
FWIW, 404, IE içeriği kısasa standart 'bulunamadı' sayfasını döndürür (sunucunun sadece 'bulunamadı' dediğini varsayar ve kullanıcıya daha güzel bir sayfa göstermeye karar verir).
Serge Wautier

16

Kayıt için, bu her durumda işleyicidir:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

edilir die()gerekli?
Daniel, Reinstate Monica'ya

Hayır, bunları dosyanın üst kısmına koyun, ardından özel bir 404 sayfası ile devam edin.
Silviu-Marian

14

Varsa, varsayılan sunucu 404 sayfasını yükleyin, örneğin apache için tanımlanmış:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

çalışmıyor, gösteriliyor Uyarı: readfile (404missing.html): akış açılamadı: /var/www/.com/public_html/index1.php

2
@ AMB Çünkü bu dosyayı kendiniz oluşturmanız gerekir.
Süper Kedi

@ SuperCat teşekkürler, şimdi hatayı yeniden okuyorum ve şimdi her şey açık.,


4

@ Kitet'e dayanan başka bir çözüm.

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);

Kontrolünüz olmayan bir sunucuda barındırılan bir web sitesini programlıyorsanız, hangi dosyanın "404missing.html" olduğunu bilmezsiniz. Ancak yine de bunu yapabilirsiniz.

Bu şekilde, aynı sunucuda normal bir 404 sayfasının tam olarak aynı sonucunu verdiniz. Bir gözlemci, var olan bir PHP sayfasının döndürdüğü 404 ile var olmayan bir sayfayı ayırt edemez.


4

ile dene:

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

Hoşçakal!


2

Biraz daha kısa versiyon. Garip yankıyı bastırın.

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.");
}

2
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;
}

yankı ifadelerini asla basitleştirmeyin ve yukarıdaki gibi iki nokta üst üste işaretini asla unutma, ayrıca sayfada bir alt dizeyi çalıştırdığımızda kolayca php_self çalıştırabiliriz


2
çünkü REQUEST_URI PHP_SELF ile aynı değil. Özellikle URL yeniden yazmanız varsa.
Timo Huovinen

1

Sunucunun varsayılan hata sayfasının görüntülenmesini istiyorsanız, bunu sunucuda işlemeniz gerekir.


1

Bazı rafineri kullanabilmesine rağmen doğru yapıyorsunuz. Görünen o ki pratik uygulama avantajlarından bahsedelim:

Çok dilli teknoloji dokümanlarından oluşan geniş bir koleksiyona sahip eski bir web sitemiz bunu başka bir koşullu koşulda yürütüyordu:

    if (<no file found>){
        die("NO FILE HERE");
    }

Sorun (yararsız mesaj ve kötü kullanıcı deneyiminin yanı sıra) genellikle kötü bağlantıları ve eksik belgeleri kontrol etmek için bir bağlantı tarayıcı (bizim durumumuzda bütünlük) kullandığımızdır. Bu, orada bir dosya olduğunu bize bildiren mükemmel bir şekilde 200 hata yanıtı aldığımız anlamına gelir. Dürüstlük, bir PDF beklediğimizi bilmiyordu, bu yüzden elle bir php ile 404 başlığı eklemek zorunda kaldık. Kodunuzu kalıbın üstüne ekleyerek (daha sonra hiçbir şey yürütülmeyecek ve başlık her zaman herhangi bir oluşturulan html'den önce olmalıdır), bütünlük (bir tarayıcı gibi az ya da çok davranan) bir 404 döndürür ve tam olarak nerede kayıp arayacağımızı bileceğiz Dosyalar. Kullanıcıya bir hata olduğunu söylemenin daha zarif yolları vardır,

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

1

Bunu dene:

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();
}

0

Bilirsiniz, web sitemde böyle bir şey yarattım:

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, 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>");

}

umarım sana yardımcı olur.


-4

Bu soruna geldim .. Sunucunuzda var olmayan bir bağlantıya yönlendirme hile yapabilir! Sunucu 404'ünü döndüreceği için:
header('Redirect abbb.404.nonexist');<bu kesin olarak mevcut değil


7
Bunu yaparsanız bu da 302 değerini döndürür. 404'lerinizi yönlendirmeyin. bunun yerine 404 durum kodunu kullanın ve bulunamadı iletisini görüntüleyin.
Rocky

-17

Sunucunun varsayılan 404 sayfasını göstermek istiyorsanız, bunu aşağıdaki gibi bir çerçeveye yükleyebilirsiniz:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
Bu, bu sitede gördüğüm en kötü cevap için bir tür rozet almalıdır.
MadTurki

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.