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.
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.
Câu trả lời:
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.
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
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ế.
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.
Đó 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.
Đố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 -->
die()
yêu cầu?
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();
}
Kể từ php 5.4, giờ bạn có thể làm http_response_code(404);
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.
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.");
}
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
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ủ.
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");
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();
}
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: "".$_SERVER['REQUEST_URI']."", 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.
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
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>';