मेरा PHP ऐप 404 त्रुटि क्यों नहीं भेजेगा?


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

यह काम क्यों नहीं होगा? मुझे एक खाली पृष्ठ मिलता है।


1
बेहतर विकल्प यह होगा कि आप 404 स्टेटस भेजें और अपने कस्टम 404 पेज को तुरंत शामिल करें। यही मैं करता था।
रॉकी

मेरे PHP सर्वर पर यह पूरी तरह से काम करता है। उपरोक्त पंक्ति सर्वर का डिफ़ॉल्ट 404 पृष्ठ लौटाती है। मुझे लगता है कि यह सर्वर में कॉन्फ़िगर किया जा सकता है।
एल्म्यू

जवाबों:


306

आपका कोड तकनीकी रूप से सही है। यदि आपने उस रिक्त पृष्ठ के शीर्षलेखों को देखा, तो आपको एक 404 शीर्षलेख दिखाई देगा, और अन्य कंप्यूटर / प्रोग्राम प्रतिक्रिया को सही ढंग से पहचानने में सक्षम होंगे क्योंकि फ़ाइल नहीं मिली।

बेशक, आपके उपयोगकर्ता अभी भी एसओएल हैं। आम तौर पर, 404 वेब सर्वर द्वारा नियंत्रित किए जाते हैं।

  • उपयोगकर्ता: अरे, क्या आपके पास इस URI वेबसर्वर में मेरे लिए कुछ है?
  • वेबसर्वर: नहीं, मैं नहीं, 404! यहां 404s प्रदर्शित करने के लिए एक पृष्ठ है।

समस्या यह है कि एक बार वेब सर्वर PHP पेज को प्रोसेस करना शुरू कर देता है, यह पहले से ही उस बिंदु से गुजर चुका है जहां यह 404 को हैंडल करेगा

  • उपयोगकर्ता: अरे, क्या आपके पास इस URI वेबसर्वर में मेरे लिए कुछ है?
  • वेबसर्वर: हां, मैं करता हूं, यह एक PHP पेज है। यह आपको बताएगा कि प्रतिक्रिया कोड क्या है
  • PHP: अरे, OMG 404 !!!!!!!
  • वेबसर्वर: ठीक है, 404 पृष्ठ के लोग पहले ही घर जा चुके हैं, इसलिए मैं बस जो भी PHP मुझे दिया था, उसके साथ भेजूंगा

404 हेडर प्रदान करने के अलावा, PHP अब वास्तविक 404 पेज के आउटपुट के लिए जिम्मेदार है।


49
14 साल की लड़की या नहीं, थोड़ा चुटीला संवाद वास्तव में मेरे लिए मायने रखता है।
rbwhitaker

20
PHP 14 साल का था
एडम लिंच

1
स्टैक ओवरफ्लो को स्टाइल के लिए +1 में कार्यक्षमता जोड़ने की आवश्यकता है। यह सभी को + 1 का मिलेगा।
जे क्वेरिडो

30
कि कैसे प्रलेखन लिखा जाना चाहिए! विशेष रूप से अपाचे प्रलेखन, जिसे मैं वास्तव में नफरत करता हूं :)
हैरी

4
खूनी शानदार ढंग से समझाया! मेरा दिन बना दिया!
आंद्रेई क्रिस्टियन प्रोडान

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
एफडब्ल्यूआईडब्ल्यू, 404 में, आईई अपना मानक 'पाया नहीं' पृष्ठ लौटाता है यदि सामग्री कम है (यह मानता है कि सर्वर सिर्फ 'नहीं मिला' कह रहा है और उपयोगकर्ता को एक अच्छे पृष्ठ को प्रदर्शित करने का निर्णय करता है)।
सर्ज वॉटियर

16

रिकॉर्ड के लिए, यह ऑल-केस हैंडलर है:

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

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

की die()आवश्यकता है
डैनियल का कहना है कि

नहीं, बस उन चीजों को फ़ाइल के शीर्ष पर रखें, फिर एक कस्टम 404 पृष्ठ के साथ आगे बढ़ें।
सिल्वियू-मैरियन

14

डिफ़ॉल्ट सर्वर 404 पृष्ठ लोड करें, यदि आपके पास एक है, उदाहरण के लिए अपाचे के लिए परिभाषित:

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 ऐसा इसलिए है क्योंकि आपको वह फाइल खुद बनानी होगी।
सुपर कैट

@SuperCat धन्यवाद, अब मैं त्रुटि को मिटाता हूं और अब सब कुछ स्पष्ट है;


4

एक अन्य समाधान, @ किटसेट पर आधारित है।

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

यदि आप एक ऐसी वेबसाइट की प्रोग्रामिंग कर रहे हैं जो सर्वर में होस्ट की गई है जिस पर आपका नियंत्रण नहीं है, तो आपको पता नहीं चलेगा कि कौन सी फाइल "404missone.html" है। हालाँकि आप अभी भी ऐसा कर सकते हैं।

इस तरह, आपने एक ही सर्वर पर एक सामान्य 404 पृष्ठ के समान परिणाम प्रदान किए। एक पर्यवेक्षक मौजूदा PHP पृष्ठ रिटर्न 404 और एक गैर-मौजूदा पृष्ठ के बीच अंतर नहीं कर पाएगा।


4

इसके साथ प्रयास करें:

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

अलविदा!


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

इको स्टेटमेंट को कभी भी सरल न करें, और ऊपर की तरह अर्ध कोलन को कभी भी न भूलें, पृष्ठ पर एक रूट भी क्यों चलाएं, हम आसानी से बस php_self चला सकते हैं


2
क्योंकि REQUEST_URI PHP_SELF के समान नहीं है। खासकर यदि आपके पास URL पुनर्लेखन है।
टिमो हुओवेंन

1

यदि आप चाहते हैं कि सर्वर का डिफ़ॉल्ट त्रुटि पृष्ठ प्रदर्शित हो, तो आपको सर्वर में इसे संभालना होगा।


1

आप इसे सही कर रहे हैं, हालांकि यह कुछ शोधन का उपयोग कर सकता है। ऐसा लगता है कि इसे संबोधित किया गया है तो आइए व्यावहारिक अनुप्रयोग लाभों पर बात करते हैं:

हमारी एक पुरानी वेबसाइट जिसमें बहुभाषी तकनीक डॉक्स का एक बड़ा संग्रह है, अगर इसे एक अन्य शर्त के अंदर निष्पादित कर रहा है:

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

समस्या (बेकार संदेश और बुरे उपयोगकर्ता अनुभव के अलावा) कि हम आम तौर पर खराब लिंक और लापता दस्तावेजों की जांच के लिए एक लिंक क्रॉलर (हमारे मामले में अखंडता) का उपयोग करते हैं। इसका मतलब है कि हमें पूरी तरह से सही 200 नो एरर रिस्पॉन्स मिल रहा था, जिसमें बताया गया था कि वहां एक फाइल थी। वफ़ादारी यह नहीं जानती थी कि हम एक पीडीएफ की उम्मीद कर रहे हैं, इसलिए हमें मैन्युअल रूप से php के साथ 404 हेडर जोड़ना होगा। मरने के बाद अपना कोड जोड़कर (क्योंकि बाद में कुछ भी निष्पादित नहीं होगा और हेडर हमेशा किसी भी तरह से प्रदान किए गए 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 स्थिति कोड का उपयोग करें और नहीं मिला संदेश प्रदर्शित करें।
रॉकी

-17

यदि आप सर्वर के डिफ़ॉल्ट 404 पृष्ठ को दिखाना चाहते हैं, तो आप इसे इस तरह फ्रेम में लोड कर सकते हैं:

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

4
मुझे इस साइट पर सबसे खराब उत्तर के लिए किसी प्रकार का बिल्ला प्राप्त करना चाहिए।
मदुरकी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.