Bagaimana cara membuat kesalahan 404 di PHP?

111

.Htaccess saya mengalihkan semua permintaan /word_hereke /page.php?name=word_here. Script PHP kemudian memeriksa apakah halaman yang diminta ada dalam susunan halamannya.

Jika tidak, bagaimana saya bisa mensimulasikan kesalahan 404? Saya mencoba ini, tetapi itu tidak mengakibatkan halaman 404 saya dikonfigurasi melalui ErrorDocumentdi .htaccessmuncul.

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

Apakah saya benar dalam berpikir bahwa itu salah untuk mengarahkan ke halaman kesalahan 404 saya?

Eric
sumber
Mengapa maksud Anda itu tidak berhasil? Apakah Anda memeriksa header respons server?
Gumbo
1
Sebagai jawaban atas pertanyaan penutup Anda, ya, adalah ide yang buruk untuk mengalihkan semua 404 ke halaman yang sebenarnya. Ini melanggar spesifikasi HTTP dengan mengubah sesuatu yang seharusnya tidak ada di sana menjadi sesuatu yang ada di sana.
Lucas Oman

Jawaban:

157

Jawaban terbaru (mulai PHP 5.4 atau yang lebih baru) untuk menghasilkan 404 halaman adalah dengan menggunakan http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() tidak sepenuhnya diperlukan, tetapi memastikan bahwa Anda tidak melanjutkan eksekusi normal.

Pedang
sumber
di file mana saya harus menambahkan ini?
Julfikar
87

Apa yang Anda lakukan akan berhasil, dan browser akan menerima kode 404. Apa yang tidak akan dilakukannya adalah menampilkan halaman "tidak ditemukan" yang mungkin Anda harapkan, misalnya:

Tidak ditemukan

URL yang diminta /test.php tidak ditemukan di server ini.

Itu karena server web tidak mengirim halaman itu ketika PHP mengembalikan kode 404 (setidaknya Apache tidak). PHP bertanggung jawab untuk mengirimkan semua outputnya sendiri. Jadi jika Anda menginginkan halaman serupa, Anda harus mengirim HTML sendiri, misalnya:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Anda dapat mengkonfigurasi Apache untuk menggunakan halaman yang sama untuk pesan 404 miliknya sendiri, dengan meletakkan ini di httpd.conf:

ErrorDocument 404 /notFound.php
JW.
sumber
Terima kasih. Saya berasumsi itu menggunakan halaman 404 saya.
Eric
@JW dimana kode di atas akan digunakan? adalah kode untuk file '.htaccess'.
Manohar Kumar
@ManoharKumar kode di atas digunakan di mana Anda ingin mengirim halaman 404. Dalam kasus saya, saya telah menggunakan ketika seseorang mencari item dengan kode itu, tetapi itu tidak ada. jadi saya menggunakan kode di atas setelah mengetahui bahwa item tidak tersedia dan saya menggunakan exit juga pada baris ke-3 kode ini, untuk menghindari memuat apa pun setelah 404 halaman. terima kasih JW, itu bekerja dengan baik untuk saya.
Harsha
22

Coba ini:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
sumber
3
Nah, 404 adalah 404 baik di HTTP 1.0 dan 1.1. 1.0 adalah taruhan yang aman. Lelucon keren BTW :) +1
Ates Goral
dalam kasus saya, saya harus memberikan header ("Location: HTTP / 1.0 404 Not Found");
Akademi EasyLearn
9

Buat halaman kesalahan kustom melalui file .htaccess

1. 404 - halaman tidak ditemukan

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Kesalahan Server Internal

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Terlarang

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Permintaan buruk

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Diperlukan Otorisasi

RewriteEngine On
ErrorDocument 401 /401.html

Anda juga dapat mengarahkan semua kesalahan ke satu halaman. Suka

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
sumber
RewriteEngine tidak ada hubungannya dengan ini; garis itu dapat dihilangkan dengan aman untuk mencapai hasil yang sama.
WoodrowShigeru
3

Apakah Anda ingat mati () setelah mengirim header? Header 404 tidak secara otomatis menghentikan pemrosesan, jadi mungkin tampak tidak melakukan apa pun jika ada pemrosesan lebih lanjut yang terjadi.

Tidak baik MENGALIHKAN ke laman 404 Anda, tetapi Anda dapat MENYERTAKAN konten darinya tanpa masalah. Dengan begitu, Anda memiliki laman yang mengirimkan status 404 dengan benar dari URL yang benar, tetapi laman itu juga memiliki "apa yang Anda cari?" halaman untuk pembaca manusia.

Eli
sumber
0

coba letakkan

ErrorDocument 404 /(root directory)/(error file) 

dalam .htaccessfile.

Lakukan ini untuk kesalahan apa pun tetapi gantikan 404 untuk kesalahan Anda.

crafteryt merah
sumber
0

Di Drupal atau Wordpress CMS (dan kemungkinan lainnya), jika Anda mencoba membuat beberapa kode php kustom tampak tidak ada (kecuali beberapa kondisi terpenuhi), berikut ini bekerja dengan baik dengan membuat pengendali 404 CMS mengambil alih:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Mike Godin
sumber
-2

Segera setelah baris itu, coba tutup respons menggunakan exitataudie()

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;

atau

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
pengguna5891645
sumber
1
Jika Anda melakukan ini, pengguna melihat halaman kosong. Pertanyaan saya adalah bagaimana mengirim halaman 404 yang sama dengan yang saya tentukan ErrorDocument, tetapi dari PHP.
Eric
jika Anda ingin menggunakan ErrorDocument Pastikan bahwa jalur ke file kesalahan kustom Anda sesuai dengan root server Contoh: misalkan jalur virtual Anda adalah / folder1 / folder2 / myhtaccess dari root server server kesalahan Anda akan terlihat seperti ini ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumenttidak berpengaruh apa pun setelah Anda memasukkan kode PHP. jawaban ini paling tepat menjelaskan kebingungan yang saya hadapi 9 tahun yang lalu
Eric
Saya harap masalah Anda teratasi sekarang. Untuk topik lain, saya pikir lebih baik Anda tidak mengalihkan dengan? Name = word_here. Sebagai gantinya, gunakan $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");di file page.php Anda. Karena ada skenario di mana salah satu halaman tersebut mengharapkan kueri "nama" dari pengguna.
pengguna5891645
-2

coba ini sekali.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Mani Kandan
sumber