ฉันจะสร้างข้อผิดพลาด 404 ใน PHP ได้อย่างไร


111

.htaccess ของฉันเปลี่ยนเส้นทางคำขอทั้งหมดเพื่อ/word_here /page.php?name=word_hereจากนั้นสคริปต์ PHP จะตรวจสอบว่าหน้าที่ร้องขออยู่ในอาร์เรย์ของหน้าหรือไม่

ถ้าไม่ฉันจะจำลองข้อผิดพลาด 404 ได้อย่างไร ฉันลองสิ่งนี้ แต่มันไม่ได้ส่งผลให้หน้า 404 ของฉันกำหนดค่าผ่านErrorDocumentการ.htaccessแสดง

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

ฉันคิดถูกหรือเปล่าที่เปลี่ยนเส้นทางไปยังหน้า error 404


ทำไมคุณถึงคิดว่ามันใช้ไม่ได้? คุณตรวจสอบส่วนหัวการตอบกลับของเซิร์ฟเวอร์หรือไม่
Gumbo

1
เพื่อตอบคำถามสรุปของคุณใช่มันเป็นความคิดที่ดีที่จะเปลี่ยนเส้นทาง 404 ทั้งหมดไปยังเพจจริง สิ่งนี้ละเมิดข้อกำหนด HTTP โดยเปลี่ยนสิ่งที่ไม่ควรมีให้เป็นสิ่งที่มีอยู่
Lucas Oman

คำตอบ:


157

คำตอบที่เป็นปัจจุบัน (ตั้งแต่ PHP 5.4 หรือใหม่กว่า) สำหรับการสร้างหน้า 404 คือการใช้http_response_code:

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

die() ไม่จำเป็นอย่างยิ่ง แต่ต้องแน่ใจว่าคุณไม่ได้ดำเนินการตามปกติต่อไป


ฉันควรเพิ่มไฟล์นี้ในไฟล์ใด
Julfikar

87

สิ่งที่คุณทำจะได้ผลและเบราว์เซอร์จะได้รับรหัส 404 สิ่งที่จะไม่ทำคือแสดงหน้า "not found" ที่คุณอาจคาดหวังเช่น:

ไม่พบ

ไม่พบ URL /test.php ที่ร้องขอบนเซิร์ฟเวอร์นี้

นั่นเป็นเพราะเว็บเซิร์ฟเวอร์ไม่ส่งหน้านั้นเมื่อ PHP ส่งคืนรหัส 404 (อย่างน้อยก็ไม่มี Apache) PHP มีหน้าที่ส่งเอาต์พุตของตัวเองทั้งหมด ดังนั้นหากคุณต้องการหน้าที่คล้ายกันคุณจะต้องส่ง HTML ด้วยตัวคุณเองเช่น:

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

คุณสามารถกำหนดค่า Apache ให้ใช้เพจเดียวกันสำหรับข้อความ 404 ของตัวเองได้โดยใส่สิ่งนี้ใน httpd.conf:

ErrorDocument 404 /notFound.php

ขอบคุณ. ฉันคิดว่ามันใช้หน้า 404 ของฉัน
Eric

@JW จะใช้รหัสข้างต้นที่ไหน? คือรหัสสำหรับไฟล์ ".htaccess"
Manohar Kumar

@ManoharKumar รหัสด้านบนใช้ในตำแหน่งที่คุณต้องการส่งหน้า 404 ในกรณีของฉันฉันเคยใช้เมื่อมีคนค้นหารายการที่มีรหัส แต่ไม่มีอยู่จริง ดังนั้นฉันจึงใช้รหัสด้านบนหลังจากพบว่าไม่มีรายการนั้นและฉันก็ใช้ exit ในบรรทัดที่ 3 ของรหัสนี้ด้วยเพื่อหลีกเลี่ยงการโหลดอะไรหลังจากหน้า 404 ขอบคุณ JW มันใช้งานได้ดีสำหรับฉัน
Harsha

22

ลองสิ่งนี้:

<?php
header("HTTP/1.0 404 Not Found");
?>

3
404 คือ 404 ทั้งใน HTTP 1.0 และ 1.1 1.0 คือการเดิมพันที่ปลอดภัย ตลกดี BTW :) +1
Ates Goral

ในกรณีของฉันฉันต้องให้ส่วนหัว ("Location: HTTP / 1.0 404 Not Found");
The EasyLearn Academy

9

สร้างหน้าข้อผิดพลาดที่กำหนดเองผ่านไฟล์. htaccess

1. 404 - ไม่พบเพจ

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - ต้องห้าม

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - คำขอไม่ถูกต้อง

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - ต้องมีการอนุญาต

RewriteEngine On
ErrorDocument 401 /401.html

คุณยังสามารถเปลี่ยนเส้นทางข้อผิดพลาดทั้งหมดไปยังหน้าเดียวได้ ชอบ

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html

RewriteEngine ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ บรรทัดนั้นสามารถละเว้นได้อย่างปลอดภัยเพื่อให้ได้ผลลัพธ์เดียวกัน
WoodrowShigeru

3

คุณจำได้ไหมว่าตาย () หลังจากส่งส่วนหัว? ส่วนหัว 404 จะไม่หยุดการประมวลผลโดยอัตโนมัติดังนั้นดูเหมือนว่าจะไม่ได้ทำอะไรเลยหากมีการประมวลผลเพิ่มเติมเกิดขึ้น

การเปลี่ยนเส้นทางไปยังหน้า 404 ของคุณไม่ดี แต่คุณสามารถรวมเนื้อหาจากหน้านี้ได้โดยไม่มีปัญหา ด้วยวิธีนี้คุณจะมีหน้าที่ส่งสถานะ 404 อย่างถูกต้องจาก URL ที่ถูกต้อง แต่ก็มี "คุณกำลังมองหาอะไรอยู่" หน้าสำหรับผู้อ่านที่เป็นมนุษย์


0

ลองใส่

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

ใน.htaccessไฟล์

ทำสิ่งนี้สำหรับข้อผิดพลาดใด ๆ แต่แทนที่ 404 สำหรับข้อผิดพลาดของคุณ


0

ใน Drupal หรือ Wordpress CMS (และอาจเป็นไปได้อื่น ๆ ) หากคุณพยายามสร้างโค้ด php ที่กำหนดเองบางอย่างดูเหมือนจะไม่มีอยู่จริง (เว้นแต่ว่าจะตรงตามเงื่อนไขบางประการ) สิ่งต่อไปนี้จะทำงานได้ดีโดยการทำให้ตัวจัดการ 404 ของ CMS เข้ามาแทนที่:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

ทันทีหลังจากนั้นให้ลองปิดการตอบกลับโดยใช้exitหรือdie()

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

หรือ

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

1
หากคุณทำเช่นนี้ผู้ใช้จะเห็นหน้าว่างเปล่า คำถามของฉันคือวิธีส่งหน้า 404 เดียวกันกับที่ฉันระบุErrorDocumentแต่มาจาก PHP
Eric

หากคุณต้องการใช้ ErrorDocument ตรวจสอบให้แน่ใจว่าพา ธ ไปยังไฟล์ข้อผิดพลาดที่กำหนดเองของคุณนั้นเกี่ยวข้องกับรูทของเซิร์ฟเวอร์ตัวอย่าง: สมมติว่าพา ธ เสมือนของคุณคือ / folder1 / folder2 / myhtaccess จากรูทของเซิร์ฟเวอร์ errordocument ของคุณจะมีลักษณะเช่นนี้ ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocumentไม่มีผลใด ๆ หลังจากที่คุณป้อนรหัส PHP แล้ว คำตอบนี้อธิบายได้ดีที่สุดถึงความสับสนที่ฉันเผชิญเมื่อ9 ปีที่แล้ว
Eric

ฉันหวังว่าปัญหาของคุณจะได้รับการแก้ไขในตอนนี้ ในเรื่องนอกฉันคิดว่าดีกว่าที่คุณไม่เปลี่ยนเส้นทางด้วย? name = word_here ให้ใช้ $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");ในไฟล์ page.php ของคุณแทน เนื่องจากมีสถานการณ์สมมติที่หนึ่งในเพจเหล่านั้นคาดหวังการสืบค้น "ชื่อ" จากผู้ใช้
user5891645

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.