2012-06-21 42 views
11

Tôi muốn hiển thị Lỗi 404 nếu người dùng đến trang tồn tại nhưng tôi không muốn họ xem.PHP - Hiển thị Lỗi 404 mà không chuyển hướng đến một trang khác

Tôi không muốn làm chuyển hướng (có thể gây ra thanh địa chỉ để hiển thị các liên kết của trang lỗi trong thanh địa chỉ) như sau:

if ($this_page_should_not_be_seen) 
    header("Location: err.php?e=404"); 

Thay vào đó, nó sẽ có vẻ như trang thực sự không tồn tại, mà không có URL trong địa chỉ của trình duyệt đã thay đổi.

+1

và những gì xảy ra với htaccess? – k102

+1

Đó là công việc cho .htaccess, không phải cho tệp PHP ... hoặc cho cả hai, nếu bạn chuyển hướng mọi thứ tới index.php, nhưng vẫn cần, bạn cần .htaccess hoặc truy cập vào httpd.conf. – Griwes

+1

có nghĩa là trình duyệt của bạn hiển thị lỗi 404 thay vì trang 404 tuỳ chỉnh? bạn có thể chuyển hướng nó đến một số trang không tồn tại trong thực tế. –

Trả lời

24

Bao gồm các trang lỗi trong trang hiện tại của bạn và gửi một mã trạng thái lỗi 404:

<?php 
if ($nobody_should_ever_be_here) { 
    header('HTTP/1.1 404 Not Found'); //This may be put inside err.php instead 
    $_GET['e'] = 404; //Set the variable for the error code (you cannot have a 
        // querystring in an include directive). 
    include 'err.php'; 
    exit; //Do not do any more work in this script. 
} 
?> 

Lưu ý rằng điều này nên được sử dụng nếu trang không bao giờ được nhìn thấy. Mã trạng thái tốt hơn cho quyền truy cập không được ủy quyền (nếu một số người dùng đã đăng nhập xem trang) là 403 (Không được ủy quyền).

+0

Tôi đã nhận ra điều này muộn nhưng đây thực sự là những gì tôi muốn. –

4

Bạn có thể đạt được một 404 (hoặc bất kỳ mã phản hồi HTTP khác thực sự) lập trình với

header('HTTP/1.0 404 Not Found'); 
die; 
+0

tôi đã làm điều đó trước khi .. không hoạt động .. –

+0

@RajBD : Nó sẽ luôn hoạt động nếu PHP chạy như một mô-đun Apache (so với chạy như FastCGI).Có lẽ nó không làm những gì bạn mong đợi *. – Jon

+1

@DilipRajBaral Nó hoạt động, nhưng khi bạn chết() ngay sau tiêu đề, bạn sẽ thấy đầu ra trống. Khi bạn đang sử dụng php header 404 nó sẽ không tự động tạo ra nội dung. Bạn nên thêm một số nội dung trước khi die() để tạo trang 404 tùy chỉnh của mình. Tiêu đề được sử dụng để thông báo cho công cụ tìm kiếm, trình thu thập thông tin và chương trình mà url hiện tại không còn khả dụng nữa. –

1

Điều bạn viết khiến chúng tôi khó hiểu.

Tôi muốn chuyển hướng bất kỳ người dùng nào đến trang lỗi 404 nếu s/he đến trang tôi không muốn họ tiếp cận.

Vì vậy, một người đến một trang tồn tại?

Nếu người đó đến ví dụ như một trang được bảo vệ mà họ không được supposted để xem. Sử dụng tiêu đề là cách tốt nhất. Tùy chọn của bạn là để echo meta-refresh hoặc javascript, nhưng tiêu đề là sạch hơn nhiều. Bạn có thể hiển thị nội dung nào đó như You do not have permission to do that!, điều này khá phổ biến trên web. Nếu bạn không muốn chuyển hướng, bạn có thể hiển thị thông báo giả "404" qua tiêu đề.

Nếu bạn đang nói về một người nào đó đến một trang 404, một tập tin đó không tồn tại, bạn chỉ có lựa chọn là sử dụng .htaccess

+0

@ k102 Có .htaccess đã được sử dụng để xử lý lỗi trang. Những gì tôi muốn làm chỉ đơn giản là hiển thị trang lỗi cho trang hiện tại vì nó sẽ được hiển thị cho trang không tồn tại. –

2

Theo kinh nghiệm của tôi cách tốt nhất để hiển thị tài liệu lỗi 404 mà không thay đổi URL là xác định tài liệu lỗi trong Apache .htaccess file:

RewriteEngine on 
RewriteBase/

# Defines 404 error pages content: 
ErrorDocument 404 /my_root/errors/404.html 

# for all invalid links (non existing files): 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* - [L,R=404] 

# for some valid links (existing files to be un-accessible): 
RewriteCond %{THE_REQUEST} ^.*some_file.php.*$ [NC] 
RewriteRule .* - [L,R=404] 
Các vấn đề liên quan