Tại sao ứng dụng PHP của tôi không gửi lỗi 404?


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

Tại sao không làm việc này? Tôi nhận được một trang trống.


1
Tùy chọn tốt hơn sẽ là gửi trạng thái 404 và bao gồm trang 404 tùy chỉnh của bạn ngay lập tức. Đó là những gì tôi đã từng làm.
Đá

Trên máy chủ PHP của tôi, nó hoạt động hoàn hảo. Dòng trên trả về trang 404 mặc định của máy chủ. Tôi cho rằng điều này có thể được cấu hình trong máy chủ.
Elmue

Câu trả lời:


306

Mã của bạn là đúng kỹ thuật. Nếu bạn nhìn vào các tiêu đề của trang trống đó, bạn sẽ thấy một tiêu đề 404 và các máy tính / chương trình khác sẽ có thể xác định chính xác phản hồi là không tìm thấy tệp.

Tất nhiên, người dùng của bạn vẫn là SOL. Thông thường, 404 được xử lý bởi máy chủ web.

  • Người dùng: Này, bạn có gì cho tôi ở máy chủ web URI này không?
  • Máy chủ web: Không, tôi không, 404! Đây là một trang để hiển thị cho 404s.

Vấn đề là, một khi máy chủ web bắt đầu xử lý trang PHP, nó đã vượt qua điểm mà nó sẽ xử lý 404

  • Người dùng: Này, bạn có gì cho tôi ở máy chủ web URI này không?
  • Máy chủ web: Vâng, tôi đồng ý, đó là một trang PHP. Nó sẽ cho bạn biết mã phản hồi là gì
  • PHP: Này, OMG 404 !!!!!!!
  • Máy chủ web: Thật tệ, mọi người ở trang 404 đã về nhà, vì vậy tôi sẽ gửi bất cứ thứ gì PHP đưa cho tôi

Ngoài việc cung cấp một tiêu đề 404, PHP hiện có trách nhiệm xuất ra trang 404 thực tế.


49
Cô gái 14 tuổi hay không, hộp thoại nhí nhảnh thực sự có ý nghĩa với tôi.
rbwhitaker

20
PHP lúc đó đã 14 tuổi
Adam Lynch

1
Stack Overflow cần thêm chức năng vào +1 cho kiểu. Điều này sẽ nhận được tất cả các +1.
Jay Querido

30
Đó là cách tài liệu nên được viết! Đặc biệt là tài liệu về Apache, điều mà tôi thực sự ghét :)
Harry

4
đẫm máu giải thích rực rỡ! làm cho ngày của tôi
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();
}

Nếu bạn nhìn vào hai dòng tiếng vang cuối cùng, đó là nơi bạn sẽ thấy nội dung. Bạn có thể tùy chỉnh nó theo cách bạn muốn.


74

Đó là hành vi chính xác , tùy thuộc vào bạn để tạo nội dung cho trang 404.
Tiêu đề 404 được sử dụng bởi các trình thu thập dữ liệu và trình quản lý tải xuống để xác định xem tệp có tồn tại không.
(Một trang có tiêu đề 404 sẽ không được google hoặc các công cụ tìm kiếm khác lập chỉ mục)

Tuy nhiên, người dùng bình thường không nhìn vào tiêu đề http và sử dụng trang như một trang bình thường.


20
FWIW, bao gồm 404, IE trả về trang 'không tìm thấy' tiêu chuẩn của nó nếu nội dung ngắn (giả sử máy chủ chỉ nói 'không tìm thấy' và quyết định hiển thị trang đẹp hơn cho người dùng).
Serge Wautier

16

Đối với hồ sơ, đây là xử lý tất cả các trường hợp:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

được die()yêu cầu?
Daniel nói Phục hồi lại

Không, chỉ cần đặt những thứ đó ở đầu tệp, sau đó tiếp tục với trang 404 tùy chỉnh.
Silviu-Marian

14

Tải trang 404 máy chủ mặc định, nếu bạn có, ví dụ: được xác định cho apache:

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

nó không hoạt động, nó hiển thị Cảnh báo: readfile (404missing.html): không thể mở luồng: Không có tệp hoặc thư mục như vậy trong /var/www/.com/public_html/index1.php trên dòng 61

2
@AMB Đó là vì bạn phải tự tạo tập tin đó.
Siêu mèo

@SuperCat cảm ơn, bây giờ tôi đọc lại lỗi và mọi thứ đã rõ ràng.,


4

Một giải pháp khác, dựa trên @ 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);

Nếu bạn đang lập trình một trang web được lưu trữ trong máy chủ mà bạn không có quyền kiểm soát, bạn sẽ không biết tệp nào là "404missing.html". Tuy nhiên bạn vẫn có thể làm điều này.

Theo cách này, bạn đã cung cấp chính xác cùng kết quả của một trang 404 bình thường trên cùng một máy chủ. Một người quan sát sẽ không thể phân biệt giữa một trang PHP hiện có trả về 404 và một trang không tồn tại.


4

thử với:

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

Tạm biệt!


2

Phiên bản ngắn hơn một chút. Ức chế tiếng vang lẻ.

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

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

không bao giờ đơn giản hóa các câu lệnh echo và không bao giờ quên dấu chấm phẩy như trên, cũng tại sao chạy một lớp nền trên trang, chúng ta có thể dễ dàng chạy php_elf


2
bởi vì REQUEST_URI không giống với PHP_SELF. Đặc biệt nếu bạn có URL viết lại.
Timo Huovinen

1

Nếu bạn muốn trang lỗi mặc định của máy chủ được hiển thị, bạn phải xử lý việc này trong máy chủ.


1

Bạn đang làm đúng mặc dù nó có thể sử dụng một số tinh chỉnh. Có vẻ như điều đó đã được giải quyết, vì vậy hãy nói về lợi ích ứng dụng thực tế:

Một trang web cũ của chúng tôi có một bộ sưu tập lớn các tài liệu công nghệ đa ngôn ngữ đang thực hiện điều này bên trong nếu có điều kiện khác:

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

Vấn đề (bên cạnh thông điệp không có ích và trải nghiệm người dùng xấu) là chúng ta thường sử dụng trình thu thập liên kết (trong trường hợp toàn vẹn) để kiểm tra các liên kết xấu và tài liệu bị thiếu. Điều này có nghĩa là chúng tôi đã nhận được 200 phản hồi lỗi hoàn toàn chính xác cho chúng tôi biết rằng có một tệp ở đó. Integrity không biết rằng chúng tôi đang mong đợi một tệp PDF nên chúng tôi phải thêm thủ công 404 bằng php. Bằng cách thêm mã của bạn lên trên khuôn (vì sau đó không có gì sẽ thực thi và tiêu đề phải luôn luôn ở trước bất kỳ html nào được hiển thị), tính toàn vẹn (hoạt động ít nhiều giống như trình duyệt) sẽ trả về 404 và chúng tôi sẽ biết chính xác nơi cần tìm các tập tin. Có nhiều cách thanh lịch hơn để nói với người dùng rằng có lỗi,

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

1

Thử cái này:

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();
}

0

Bạn biết đấy, trong trang web của tôi, tôi đã tạo ra một cái gì đó như thế này:

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

}

Tôi hy vọng nó sẽ giúp bạn.


-4

Tôi đã gặp phải vấn đề này .. Tôi nghĩ rằng việc chuyển hướng đến một liên kết không tồn tại trên máy chủ của bạn có thể là một mẹo nhỏ! Bởi vì máy chủ sẽ trả về 404 của anh ấy:
header('Redirect abbb.404.nonexist');<điều đó không tồn tại chắc chắn


7
Điều đó cũng sẽ trả lại một 302 nếu bạn làm điều đó. Tốt hơn đừng chuyển hướng 404 của bạn. thay vào đó sử dụng mã trạng thái 404 và hiển thị thông báo không tìm thấy.
Đá

-17

Nếu bạn muốn hiển thị trang 404 mặc định của máy chủ, bạn có thể tải nó trong một khung như thế này:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
Điều này sẽ nhận được một số loại huy hiệu cho câu trả lời tồi tệ nhất tôi đã thấy trên trang web này.
MadTurki

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.