Mengapa aplikasi PHP saya tidak mengirim kesalahan 404?

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

Mengapa ini tidak berhasil? Saya mendapatkan halaman kosong.

danorton
sumber
1
Pilihan yang lebih baik adalah mengirim status 404 dan segera memasukkan halaman kustom 404 Anda. Itu yang biasa saya lakukan.
Rocky
Di server PHP saya berfungsi dengan baik. Baris di atas mengembalikan halaman 404 default server. Saya kira ini dapat dikonfigurasi di server.
Elmue

Jawaban:

306

Kode Anda secara teknis benar. Jika Anda melihat tajuk halaman kosong itu, Anda akan melihat tajuk 404, dan komputer / program lain akan dapat mengidentifikasi respons dengan benar karena file tidak ditemukan.

Tentu saja, pengguna Anda masih SOL. Biasanya, 404 ditangani oleh server web.

  • Pengguna: Hei, apakah Anda punya sesuatu untuk saya di server web URI ini?
  • Server Web: Tidak, saya tidak, 404! Berikut adalah halaman untuk ditampilkan untuk 404s.

Masalahnya adalah, begitu server web mulai memproses halaman PHP, itu sudah melewati titik di mana ia akan menangani 404

  • Pengguna: Hei, apakah Anda punya sesuatu untuk saya di server web URI ini?
  • Server Web: Ya, saya tahu, ini adalah halaman PHP. Ini akan memberi tahu Anda apa kode responsnya
  • PHP: Hei, OMG 404 !!!!!!!
  • Webserver: Baiklah, 404 halaman orang sudah pulang, jadi saya akan mengirimkan apa pun yang diberikan PHP kepada saya

Selain menyediakan header 404, PHP sekarang bertanggung jawab untuk menghasilkan halaman 404 yang sebenarnya.

Alan Storm
sumber
49
Gadis berusia 14 tahun atau tidak, dialog kecil murahan ini benar-benar masuk akal bagi saya.
rbwhitaker
20
PHP saat itu 14
Adam Lynch
1
Stack Overflow perlu menambahkan fungsionalitas ke +1 untuk gaya. Ini akan mendapatkan semua +1.
Jay Querido
30
Begitulah cara dokumentasi harus ditulis! Terutama dokumentasi Apache, yang sangat saya benci :)
Harry
4
berdarah menjelaskan dengan cemerlang! membuatku bahagia!
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();
}

Jika Anda melihat dua baris gema terakhir, di situlah Anda akan melihat kontennya. Anda dapat menyesuaikannya sesuka Anda.

Evan Fosmark
sumber
74

Itu perilaku yang benar , terserah Anda untuk membuat konten untuk halaman 404.
Header 404 digunakan oleh spider dan manajer unduhan untuk menentukan apakah file itu ada.
(Halaman dengan header 404 tidak akan diindeks oleh google atau mesin pencari lainnya)

Namun pengguna normal tidak melihat http-header dan menggunakan halaman sebagai halaman normal.

Bob Fanger
sumber
20
FWIW, memetikan 404, IE mengembalikan halaman standar 'tidak ditemukan' jika kontennya pendek (diasumsikan server hanya mengatakan 'tidak ditemukan' dan memutuskan untuk menampilkan halaman yang lebih bagus untuk pengguna).
Serge Wautier
16

Sebagai catatan, ini adalah penangan kasus:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
Silviu-Marian
sumber
yang die()diperlukan?
Daniel berkata Reinstate Monica
Tidak, cukup letakkan hal-hal itu di bagian atas file, kemudian lanjutkan dengan halaman 404 khusus.
Silviu-Marian
14

Muat halaman server default 404, jika Anda memilikinya, misalnya ditentukan untuk apache:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
Kitet
sumber
itu tidak berfungsi, ini menunjukkan Peringatan: readfile (404missing.html): gagal membuka streaming: Tidak ada file atau direktori seperti itu di /var/www/.com/public_html/index1.php pada baris 61
2
@ AMB Itu karena Anda harus membuat file itu sendiri.
Super Cat
@SuperCat terima kasih, sekarang saya membaca ulang kesalahan dan semuanya jelas sekarang.,
4

Solusi lain, berdasarkan @ 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);

Jika Anda memprogram situs web yang dihosting di server yang tidak Anda kendalikan, Anda tidak akan tahu file mana yang merupakan "404missing.html". Namun Anda masih bisa melakukan ini.

Dengan cara ini, Anda memberikan hasil yang sama persis dengan halaman 404 normal di server yang sama. Pengamat tidak akan dapat membedakan antara halaman PHP yang ada menghasilkan 404 dan halaman yang tidak ada.

Mesin Tanah
sumber
4

coba dengan:

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

Sampai jumpa!

Olaf
sumber
2

Versi yang sedikit lebih pendek. Menekan gema aneh.

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

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

tidak pernah menyederhanakan pernyataan gema, dan tidak pernah melupakan titik koma seperti di atas, juga mengapa menjalankan substr pada halaman, kita dapat dengan mudah menjalankan php_self

Jesse
sumber
2
karena REQUEST_URI tidak sama dengan PHP_SELF. Terutama jika Anda memiliki penulisan ulang URL.
Timo Huovinen
1

Jika Anda ingin halaman kesalahan default server ditampilkan, Anda harus menangani ini di server.

Gumbo
sumber
1

Anda melakukannya dengan benar meskipun itu bisa menggunakan pemurnian. Sepertinya itu sudah diatasi jadi mari kita bicara manfaat aplikasi praktis:

Sebuah situs web lama milik kami yang memiliki banyak koleksi dokumen teknologi multibahasa menjalankan ini di dalam kondisi yang lain:

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

Masalahnya (selain pesan yang tidak membantu dan pengalaman pengguna yang buruk) adalah bahwa kami biasanya menggunakan perayap tautan (dalam integritas kasus kami) untuk memeriksa tautan buruk dan dokumen yang hilang. Ini berarti bahwa kami mendapatkan jawaban benar yang benar 200 tidak ada kesalahan memberitahu kami bahwa ada file di sana. Integritas tidak tahu bahwa kami mengharapkan PDF, jadi kami harus menambahkan header 404 secara manual dengan php. Dengan menambahkan kode Anda di atas dadu (karena tidak ada yang akan dieksekusi dan tajuk harus selalu ada sebelum html apa pun yang diberikan), integritas (yang berperilaku kurang lebih seperti peramban) akan mengembalikan 404 dan kami akan tahu persis ke mana harus mencari yang hilang. file. Ada cara yang lebih elegan untuk memberi tahu pengguna bahwa ada kesalahan,

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

Coba ini:

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();
}
Mohammad Farhoudi
sumber
0

Anda tahu, di situs web saya, saya membuat sesuatu seperti ini:

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

}

Saya harap ini membantu Anda.

GGG
sumber
-4

Saya menemukan masalah ini .. Saya pikir bahwa mengarahkan ulang ke tautan yang tidak ada di server Anda mungkin melakukan trik! Karena server akan mengembalikan 404-nya:
header('Redirect abbb.404.nonexist');<itu tidak ada pasti

GorillaApe
sumber
7
Itu juga akan mengembalikan 302 jika Anda melakukannya. Lebih baik tidak mengarahkan 404 Anda. alih-alih gunakan kode status 404 dan tampilkan pesan yang tidak ditemukan.
Rocky
-17

Jika Anda ingin menampilkan halaman 404 default server, Anda dapat memuatnya dalam bingkai seperti ini:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';
jangkrik
sumber
4
Ini harus menerima semacam lencana untuk jawaban terburuk yang pernah saya lihat di situs ini.
MadTurki
1
@ MadTurki Ada jauh lebih buruk.
bjb568