ทำไมแอป PHP ของฉันไม่ส่งข้อผิดพลาด 404


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

ทำไมถึงใช้งานไม่ได้ ฉันได้รับหน้าว่าง


1
ตัวเลือกที่ดีกว่าคือการส่งสถานะ 404 และรวมหน้าเว็บ 404 ที่กำหนดเองของคุณทันที นั่นคือสิ่งที่ฉันเคยทำ
Rocky

บนเซิร์ฟเวอร์ PHP ของฉันมันทำงานได้อย่างสมบูรณ์ บรรทัดข้างต้นส่งคืน 404 หน้าเริ่มต้นของเซิร์ฟเวอร์ ฉันคิดว่านี่สามารถกำหนดค่าในเซิร์ฟเวอร์
Elmue

คำตอบ:


306

รหัสของคุณถูกต้องทางเทคนิค หากคุณดูที่ส่วนหัวของหน้าว่างคุณจะเห็นส่วนหัว 404 และคอมพิวเตอร์ / โปรแกรมอื่น ๆ จะสามารถระบุการตอบสนองได้อย่างถูกต้องเนื่องจากไม่พบไฟล์

แน่นอนผู้ใช้ของคุณยังคง SOL โดยปกติเว็บเซิร์ฟเวอร์จะจัดการ 404 วินาที

  • ผู้ใช้: สวัสดีคุณมีอะไรให้ฉันที่เว็บเซิร์ฟเวอร์ URI หรือไม่
  • เว็บเซิร์ฟเวอร์: ไม่ฉันไม่ทำ 404! นี่คือหน้าสำหรับแสดงสำหรับ 404s

ปัญหาคือเมื่อเว็บเซิร์ฟเวอร์เริ่มประมวลผลหน้า PHP ก็ผ่านจุดที่มันจะจัดการ 404

  • ผู้ใช้: สวัสดีคุณมีอะไรให้ฉันที่เว็บเซิร์ฟเวอร์ URI หรือไม่
  • เว็บเซิร์ฟเวอร์: ใช่ฉันเป็นหน้า PHP มันจะบอกคุณว่ารหัสการตอบสนองคืออะไร
  • PHP: เฮ้ OMG 404 !!!!!!!
  • เว็บเซิร์ฟเวอร์: อึคน 404 หน้าได้กลับบ้านแล้วดังนั้นฉันจะส่งสิ่งที่ PHP ให้ฉัน

นอกเหนือจากการจัดเตรียมส่วนหัว 404 ปัจจุบัน PHP มีหน้าที่รับผิดชอบในการแสดงผลหน้าจริง 404


49
เด็กหญิงอายุ 14 ปีหรือไม่บทสนทนาเล็ก ๆ น้อย ๆ ทำให้ฉันเข้าใจเรื่องนี้จริงๆ
rbwhitaker

20
PHP นั้นย้อนกลับไป 14 ครั้ง
Adam Lynch

1
Stack Overflow จำเป็นต้องเพิ่มฟังก์ชันการทำงานให้กับ +1 เพื่อให้มีสไตล์ นี่จะได้ +1 ทั้งหมด
Jay Querido

30
นั่นคือวิธีการเขียนเอกสาร! โดยเฉพาะอย่างยิ่งเอกสาร Apache ซึ่งแท้จริงฉันเกลียด :)
แฮร์รี่

4
เลือดอธิบายเก่ง! ทำวันของฉัน!
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();
}

หากคุณดูที่สองเส้นเสียงก้องนั่นคือสิ่งที่คุณจะเห็นเนื้อหา คุณสามารถปรับแต่งได้ตามที่คุณต้องการ


74

นั่นคือพฤติกรรมที่ถูกต้องมันขึ้นอยู่กับคุณที่จะสร้างเนื้อหาสำหรับหน้า 404
ส่วนหัว 404 ถูกใช้โดยสไปเดอร์และตัวจัดการดาวน์โหลดเพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่
(หน้าเว็บที่มีส่วนหัว 404 จะไม่ถูกสร้างดัชนีโดย Google หรือเครื่องมือค้นหาอื่น ๆ )

ผู้ใช้ทั่วไปไม่ดู http-headers และใช้หน้าเป็นหน้าปกติ


20
FWIW ในกรณีที่ 404 IE จะส่งคืนหน้า 'ไม่พบ' มาตรฐานหากเนื้อหานั้นสั้น (สมมติว่าเซิร์ฟเวอร์กำลังบอกว่า 'ไม่พบ' และตัดสินใจที่จะแสดงหน้าเว็บที่ดีกว่าแก่ผู้ใช้)
Serge Wautier

16

สำหรับบันทึกนี้เป็นตัวจัดการทุกกรณี:

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

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

ถูกdie()ต้อง?
Daniel บอก Reinstate Monica

ไม่เพียงแค่วางสิ่งเหล่านั้นที่ด้านบนของไฟล์จากนั้นดำเนินการกับหน้าเว็บ 404 ที่กำหนดเอง
Silviu-Marian

14

โหลดหน้าเซิร์ฟเวอร์เริ่มต้น 404 หากคุณมีหนึ่งหน้าเช่นกำหนดไว้สำหรับ Apache

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

มันไม่ทำงานแสดงคำเตือน: readfile (404missing.html): ไม่สามารถเปิดสตรีม: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวใน /var/www/.com/public_html/index1.php บรรทัดที่ 61

2
@AMB นั่นเป็นเพราะคุณต้องสร้างไฟล์ด้วยตัวเอง
Super Cat

@ SuperCat ขอบคุณตอนนี้ฉันอ่านข้อผิดพลาดอีกครั้งและทุกอย่างชัดเจนแล้วในตอนนี้,


4

อีกวิธีการหนึ่งขึ้นอยู่กับ @ 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);

หากคุณกำลังเขียนโปรแกรมเว็บไซต์ที่โฮสต์ในเซิร์ฟเวอร์ที่คุณไม่มีการควบคุมคุณจะไม่ทราบว่าไฟล์ใดคือ "404missing.html" อย่างไรก็ตามคุณยังสามารถทำสิ่งนี้ได้

ด้วยวิธีนี้คุณให้ผลลัพธ์เดียวกันกับหน้า 404 ปกติบนเซิร์ฟเวอร์เดียวกัน ผู้สังเกตการณ์จะไม่สามารถแยกความแตกต่างระหว่างหน้า PHP ที่มีอยู่ส่งคืน 404 และหน้าเว็บที่ไม่มีอยู่



2

รุ่นที่สั้นกว่าเล็กน้อย ระงับเสียงสะท้อนแปลก ๆ

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

ไม่ทำให้คำสั่ง echo ง่ายขึ้นและอย่าลืมเซมิโคลอนเหมือนด้านบนและทำไมเรียกใช้ substr บนหน้าเราสามารถรัน php_self ได้อย่างง่ายดาย


2
เนื่องจาก REQUEST_URI ไม่เหมือนกับ PHP_SELF โดยเฉพาะถ้าคุณมีการเขียน URL ใหม่
Timo Huovinen

1

หากคุณต้องการให้หน้าแสดงข้อผิดพลาดเริ่มต้นของเซิร์ฟเวอร์คุณต้องจัดการกับสิ่งนี้ในเซิร์ฟเวอร์


1

คุณทำถูกต้องแม้ว่าจะสามารถใช้การกลั่นได้ ดูเหมือนว่าได้รับการแก้ไขดังนั้นให้พูดคุยประโยชน์ของการใช้งานจริง:

เว็บไซต์เก่าของเราที่มีคอลเลกชันเอกสารเทคโนโลยีหลายภาษาจำนวนมากกำลังทำงานอยู่ภายในเงื่อนไขอื่น:

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

ปัญหา (นอกเหนือจากข้อความที่ไม่ช่วยเหลือและประสบการณ์การใช้งานที่ไม่ดี) ซึ่งโดยทั่วไปแล้วเราใช้โปรแกรมรวบรวมลิงค์ (ในกรณีที่ใช้งานจริง) เพื่อตรวจสอบลิงค์ที่ไม่ดีและเอกสารที่หายไป ซึ่งหมายความว่าเราได้รับการแก้ไขข้อผิดพลาดอย่างสมบูรณ์แบบ 200 โดยบอกว่ามีไฟล์อยู่ที่นั่น ความถูกต้องไม่ทราบว่าเราคาดหวัง PDF ดังนั้นเราจึงต้องเพิ่มส่วนหัว 404 ด้วย php ด้วยตนเอง ด้วยการเพิ่มโค้ดของคุณเหนือความตาย (เพราะไม่มีอะไรหลังจากนั้นจะดำเนินการและส่วนหัวควรอยู่ก่อน HTML ใด ๆ ต่อไป) ความสมบูรณ์ (ซึ่งมีพฤติกรรมมากกว่าหรือน้อยกว่าเช่นเบราว์เซอร์) จะกลับ 404 และเราจะรู้ว่า ไฟล์ มีวิธีที่สวยงามกว่าในการบอกผู้ใช้ว่ามีข้อผิดพลาด

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

1

ลองสิ่งนี้:

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

คุณจะรู้ว่าในเว็บไซต์ของฉันฉันสร้างบางสิ่งเช่นนี้:

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

}

ฉันหวังว่ามันจะช่วยคุณ


-4

ฉันพบปัญหานี้ .. ฉันคิดว่าการเปลี่ยนเส้นทางไปยังลิงก์ที่ไม่มีอยู่ในเซิร์ฟเวอร์ของคุณอาจเป็นการหลอกลวง! เพราะเซิร์ฟเวอร์จะคืนค่า 404 ของเขา:
header('Redirect abbb.404.nonexist');<ที่ไม่มีอยู่แน่นอน


7
นั่นจะส่งคืน 302 หากคุณทำเช่นนั้น ดีกว่าอย่าเปลี่ยนเส้นทาง 404 ของคุณ ใช้รหัสสถานะ 404 แทนและแสดงข้อความที่ไม่พบ
Rocky

-17

หากคุณต้องการแสดงหน้า 404 ที่เป็นค่าเริ่มต้นของเซิร์ฟเวอร์คุณสามารถโหลดในกรอบดังนี้:

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

4
สิ่งนี้ควรได้รับตราบางประเภทสำหรับคำตอบที่แย่ที่สุดที่ฉันเคยเห็นในเว็บไซต์นี้
MadTurki

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