Làm cách nào để tạo lỗi 404 trong PHP?


111

.Htaccess của tôi chuyển hướng tất cả các yêu cầu /word_heređến /page.php?name=word_here. Sau đó, tập lệnh PHP sẽ kiểm tra xem trang được yêu cầu có nằm trong mảng các trang của nó hay không.

Nếu không, làm thế nào tôi có thể mô phỏng lỗi 404? Tôi đã thử điều này, nhưng nó không dẫn đến trang 404 của tôi được định cấu hình thông qua ErrorDocumenttrong .htaccesshiển thị.

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

Tôi có đúng khi nghĩ rằng việc chuyển hướng đến trang lỗi 404 của tôi là sai không?


Tại sao bạn có nghĩa là nó không hoạt động? Bạn đã kiểm tra tiêu đề phản hồi của máy chủ chưa?
Gumbo

1
Để trả lời cho câu hỏi kết luận của bạn, vâng, sẽ là một ý tưởng tồi nếu chuyển hướng tất cả 404 đến một trang thực. Điều này vi phạm thông số kỹ thuật HTTP bằng cách biến một cái gì đó không nên có ở đó thành một cái gì đó ở đó.
Lucas Oman

Câu trả lời:


156

Câu trả lời cập nhật (kể từ PHP 5.4 hoặc mới hơn) để tạo trang 404 là sử dụng http_response_code:

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

die() không hoàn toàn cần thiết, nhưng nó đảm bảo rằng bạn không tiếp tục thực hiện bình thường.


Tôi nên thêm cái này vào tệp nào?
Julfikar

87

Những gì bạn đang làm sẽ hoạt động và trình duyệt sẽ nhận được mã 404. Những gì nó sẽ không làm là hiển thị trang "không tìm thấy" mà bạn có thể mong đợi, ví dụ:

Không tìm thấy

Không tìm thấy URL /test.php được yêu cầu trên máy chủ này.

Đó là bởi vì máy chủ web không gửi trang đó khi PHP trả về mã 404 (ít nhất là Apache thì không). PHP chịu trách nhiệm gửi tất cả đầu ra của chính nó. Vì vậy, nếu bạn muốn có một trang tương tự, bạn sẽ phải tự gửi HTML, ví dụ:

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

Bạn có thể định cấu hình Apache để sử dụng cùng một trang cho các thông báo 404 của chính nó, bằng cách đặt trang này vào httpd.conf:

ErrorDocument 404 /notFound.php

Cảm ơn. Tôi cho rằng nó đã sử dụng trang 404 của tôi.
Eric

@JW mã trên sẽ được sử dụng ở đâu? là mã cho tệp '.htaccess'.
Manohar Kumar

@ManoharKumar sử dụng mã trên ở nơi bạn muốn gửi trang 404. Trong trường hợp của tôi, tôi đã sử dụng khi ai đó tìm kiếm một mặt hàng với mã của nó, nhưng nó không tồn tại. vì vậy tôi sử dụng mã trên sau khi phát hiện ra rằng mục đó không có sẵn và tôi cũng sử dụng thoát ở dòng thứ 3 của mã này, để tránh tải bất kỳ thứ gì sau trang 404. cảm ơn JW, nó đã làm việc hoàn hảo cho tôi.
Harsha

22

Thử cái này:

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

3
Vâng, 404 là 404 cả trong HTTP 1.0 và 1.1. 1.0 là mức cược an toàn. Trò đùa thú vị BTW :) +1
Ates Goral

trong trường hợp của tôi, tôi phải cung cấp tiêu đề ("Vị trí: HTTP / 1.0 404 Không tìm thấy");
Học viện EasyLearn

9

Tạo các trang lỗi tùy chỉnh thông qua tệp .htaccess

1. 404 - không tìm thấy trang

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Lỗi máy chủ nội bộ

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Bị cấm

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Yêu cầu không hợp lệ

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Yêu cầu ủy quyền

RewriteEngine On
ErrorDocument 401 /401.html

Bạn cũng có thể chuyển hướng tất cả các lỗi đến một trang. giống

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

RewriteEngine không liên quan gì đến điều này; dòng đó có thể được bỏ qua một cách an toàn để đạt được kết quả tương tự.
WoodrowShigeru

3

Bạn có nhớ die () sau khi gửi tiêu đề không? Tiêu đề 404 không tự động ngừng xử lý, vì vậy, nó có thể không thực hiện được gì nếu có quá trình xử lý tiếp theo xảy ra.

Điều chỉnh lại trang 404 của bạn là không tốt, nhưng bạn có thể BAO GỒM nội dung từ đó mà không có vấn đề gì. Bằng cách đó, bạn có một trang gửi đúng trạng thái 404 từ đúng URL, nhưng nó cũng có "bạn đang tìm gì?" trang cho người đọc con người.


0

thử đặt

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

trong .htaccesshồ sơ.

Làm điều này cho bất kỳ lỗi nào nhưng thay thế 404 cho lỗi của bạn.


0

Trong CMS Drupal hoặc Wordpress (và có thể là những người khác), nếu bạn đang cố gắng làm cho một số mã php tùy chỉnh dường như không tồn tại (trừ khi một số điều kiện được đáp ứng), những điều sau sẽ hoạt động tốt bằng cách làm cho trình xử lý 404 của CMS tiếp quản:

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

-2

Ngay sau dòng đó, hãy thử đóng phản hồi bằng cách sử dụng exithoặcdie()

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

hoặc là

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

1
Nếu bạn làm điều này, người dùng sẽ thấy một trang trống. Câu hỏi của tôi là làm thế nào để gửi cùng một trang 404 mà tôi đã chỉ định ErrorDocument, nhưng từ PHP.
Eric

nếu bạn muốn sử dụng ErrorDocument Đảm bảo rằng đường dẫn đến tệp lỗi tùy chỉnh của bạn liên quan đến thư mục gốc của máy chủ, ví dụ: giả sử đường dẫn ảo của bạn là / folder1 / folder2 / myhtaccess fromt he root of server, errordocument của bạn sẽ trông giống như thế này ErrorDocument 404 /folder1/folder2/my404.html
user5891645 Ngày

ErrorDocumentkhông có bất kỳ ảnh hưởng nào sau khi bạn đã nhập mã PHP. câu trả lời này giải thích tốt nhất cho sự bối rối mà tôi phải đối mặt 9 năm trước
Eric

Tôi hy vọng vấn đề của bạn đã được giải quyết ngay bây giờ. Về một chủ đề lạc quan, tôi nghĩ tốt hơn là bạn không chuyển hướng với? Name = word_here. Thay vào đó, hãy sử dụng $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");trong tệp page.php của bạn. Có một tình huống mà một trong những trang đó đang mong đợi một "tên" truy vấn từ người dùng.
user5891645

-2

hãy thử điều này một lần.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.