WSOD को बदलने के लिए अनुकूल त्रुटि पृष्ठ


10

यह सबसे आसान काम होना चाहिए, लेकिन किसी कारण से मैं इसे पूरा नहीं कर सकता।

मैं गंदा 500 परिदृश्यों को बदलने के लिए एक अनुकूल स्थिर त्रुटि पृष्ठ प्राप्त करने की कोशिश कर रहा हूं। अभी के लिए मैं सिर्फ अपने विषय में 500 स्थानीय स्थिति को दोहराने की कोशिश कर रहा हूं (Drupal 7, MAMP पर चल रहा है), जो मेरे विषय में मेरे टेम्पलेट.php के शीर्ष पर कुछ बकवास पात्रों में फेंक रहा है, जो 500 स्थिति को ट्रिगर करता है, लेकिन मेरे .htaccessया Apache config फाइल में ErrorDocument निर्देश का कोई कारण नहीं है।

मैं जो कर रहा हूं वह बस इतना है:

ErrorDocument 500 /500.html

और मेरी साइट के मूल में 500.html के नाम के साथ सबसे सरल स्थिर html-पृष्ठ है।

फिर भी, जब मैं जानबूझकर टेम्पलेट को तोड़ता हूं, तो मुझे अपने अच्छे फ्रेंडली एरर पेज के बजाय खतरनाक व्हाइट स्क्रीन ऑफ डेथ मिल जाती है।

मुझसे यहां क्या गलत हो रहा है? मैंने यह एक बार नॉन-ड्रुपल सेटअप में किया है, लेकिन इस एक के आसपास मेरा सिर नहीं मिल सकता है।


अद्यतन : ऐसा लगता है कि यह प्रश्न मेरे विशिष्ट उपयोग के मामले में अभी बहुत हद तक बेमानी है क्योंकि एक्विआ के देव क्लाउड जो कि हम प्रश्न में एप्लिकेशन को चलाने के लिए उपयोग करते हैं, फिलहाल 500-श्रृंखला त्रुटि पृष्ठों को अनुकूलित करने का समर्थन नहीं करता है। यहाँ उम्मीद है कि वे जल्द ही इसके लिए समर्थन लागू करेंगे।


यदि आप drupal_add_http_header('Status', '503 Service Unavailable');अपने 500.html में जोड़ते हैं तो क्या होता है ?
शौकिया बरिस्ता

जवाबों:


2

500 त्रुटि पृष्ठ कड़ाई से सर्वर त्रुटि पृष्ठ हैं। एक बार जब सर्वर PHP से निष्पादन बंद कर देता है, तो Drupal / PHP अपने स्वयं के त्रुटि पृष्ठ की सेवा के लिए जिम्मेदार होते हैं। जब आप किसी try...catchब्लॉक में कुछ त्रुटियां प्राप्त करते हैं, तो आप Drupal को एक कस्टम त्रुटि पृष्ठ पर HTTP 500 स्थिति हेडर के साथ उपयोगकर्ता को पुनर्निर्देशित करने की कोशिश कर सकते हैं ।

हालांकि, ध्यान दें कि कुछ WSOD सिस्टम स्तर पर हो सकते हैं और वे एक घातक त्रुटि का कारण बन सकते हैं जो तुरंत निष्पादन catchको रोक देता है और संभवतः निष्पादित करने से रोकता है । इसका एक उदाहरण यह है कि जब आपके डेटाबेस को निश्चित आकार के प्रश्नों को संभालने के लिए ठीक से ट्यून नहीं किया जाता है (जैसे कि जब कोई विशेषताएँ सभी ऑपरेशन को वापस कर रही होती हैं) - डेटाबेस आपको एक इंस्टा-डब्लूएसओडी दे सकता है।

मैं कहता हूं कि सबसे अच्छी बात यह है कि आपकी अपाचे, MySQL और PHP त्रुटि लॉग की जांच करें, और एक केस-दर-मामला आधार पर WSOD के मूल कारण को अलग करने की कोशिश करें, जैसा कि उन्हें एक सुंदर के साथ कवर करने की कोशिश करने का विरोध किया गया था। त्रुटि पृष्ठ। जबकि विशिष्ट 500 सर्वर त्रुटि पृष्ठों के कारण होने वाली त्रुटियां कभी-कभी अपरिहार्य होती हैं, और उत्पादन में कस्टम सर्वर त्रुटि पेजों का होना संभव नहीं है, ऐसा होने पर WSODs लाइव नहीं है।

ऐसा लगता है कि आपके पास सर्वर त्रुटि पृष्ठ ठीक से सेट हैं। आपको केवल विशिष्ट सर्वर त्रुटि पृष्ठों! = WSODs का अंतर बनाने की आवश्यकता है। उच्च ट्रैफ़िक और संसाधन बाधाओं के कारण सर्वर त्रुटि पृष्ठों को ट्रिगर किया जा सकता है, लेकिन आपको वास्तव में उत्पादन, अवधि में WSODs नहीं होना चाहिए। ये आमतौर पर खराब कोडिंग, अनुकूलन या कॉन्फ़िगरेशन के कारण होता है। यदि आप अभी भी एक WSOD देखते हैं, तो सुनिश्चित करें कि आपको समस्या का मूल कारण पहले मिल जाए (और हल करें), जैसा कि इसके लिए एक बैंड-सहायता लागू करने की कोशिश के विपरीत है।


4
आपके उत्तर के लिए धन्यवाद। आप लक्षणों के मूल कारण / उपचार के बारे में बिल्कुल सही हैं। यह हालांकि अच्छी त्रुटि वाले पृष्ठों की आवश्यकता के लिए अप्रासंगिक है क्योंकि यह एक तथ्य है कि एक सेवा के जीवनकाल के दौरान, त्रुटियां होंगी और उन स्थितियों में उपयोगकर्ताओं को स्थिति को बेहतर ढंग से संवाद करना बेहतर होगा बजाय खाली पन्नों के साथ या सफेद के साथ सामान्य काले। "सर्वर त्रुटि" पृष्ठ। उदाहरण के रूप में ट्विटर विफल हो गया। यह पेशेवर त्रुटि प्रोफाइलिंग की आवश्यकता को दूर नहीं करता है, लेकिन अंतरिम पर, उपयोगकर्ताओं को कम गुस्सा दिलाता है।
टॉमी फोर्सस्ट्रोम जूल

1
इसके अलावा, इस मामले के लिए उन परतों के बीच अंतर करने की आवश्यकता नहीं है जिनसे त्रुटि उत्पन्न होती है (जब तक कि यह http सर्वर के नीचे है) क्योंकि मुझे आवेदन परत में त्रुटियों के लिए कैच-ऑल मैकेनिज्म की आवश्यकता है, चाहे वह डेटाबेस क्रैश हो रहा हो , किसी ने बकवास कोड (और यह कि हमारी परीक्षा कवरेज पास कर रहा है) और किसी भी अन्य कल्पनीय अभी तक अप्रत्याशित त्रुटि स्थिति। लेकिन जैसा कि सवाल में अद्यतन किया गया है, यह मेरे लिए इस समय अप्रासंगिक है क्योंकि एक्वीया के देव बादल फिलहाल 500-श्रृंखला त्रुटि पृष्ठों को अनुकूलित करने का समर्थन नहीं करते हैं।
टॉमी फोर्सस्ट्रोम जूल

"एक्विआ के देव बादल फिलहाल 500-श्रृंखला त्रुटि पृष्ठों को अनुकूलित करने का समर्थन नहीं करते हैं।" Aww shucks, यह जानना अच्छा है।
शौकिया बरिस्ता

हालांकि यह लगभग एकलौते ताकतवर देव बादल के साथ मरहम में उड़ता है और वे निकट भविष्य में इसे लागू भी कर सकते हैं। मैं देव बादल के लिए पर्याप्त रूप से पर्याप्त नहीं बोल सकता। यह Drupal सेवाओं को चलाने के लिए एक अद्भुत मंच है!
टॉमी फोर्सस्ट्रोम जूल

1

आप WSOD प्राप्त कर रहे हैं क्योंकि आपने php.ini में रिपोर्टिंग को बंद कर दिया है। यह एक सुरक्षा समस्या है - यदि आपके पास कोई त्रुटि है और हैकर देखता है कि यह क्या है, तो वह संभवतः इसका उपयोग साइट को हैक करने के लिए कर सकता है।

यदि आप त्रुटि को रोकना चाहते हैं, हालांकि, आपको php.ini में त्रुटियों को दिखाने में सक्षम करने की आवश्यकता है (उदाहरण केवल त्रुटि दिखाएगा):

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

और फिर, आप htaccess फ़ाइल में त्रुटि दस्तावेज़ सेट कर सकते हैं:

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

वैकल्पिक रूप से, आप Drupal की settings.php फ़ाइल में त्रुटियों को निर्दिष्ट कर सकते हैं ।

NGINX में:

error_page 403 = /error.php?code=403;   
error_page 404 = /error.php?code=404;
error_page 500 = /error.php?code=500;

जब से आप MAMP में Apache चला रहे हैं, इसे .htaccess में सेट करें। याद रखें कि AllowOverrideअपाचे में कॉन्फ़िगरेशन चालू होना चाहिए (आमतौर पर यह है)।


ErrorDocumentद्रुपल में 500 प्रतिक्रियाओं के लिए एक निर्देश स्थापित करने से मेरे परीक्षण में काम नहीं होता है
cdmo

500 त्रुटियाँ आमतौर पर Drupal में सेट नहीं की जा सकती हैं। अपाचे का उपयोग करने पर उन्हें Drupal - .htaccess से पहले सेट करने की आवश्यकता होती है। NGINX में - अद्यतन टिकट देखें।
अलेक्सेई रेयू

मेरा मतलब यही था। क्या आप एक htaccess में सेट 500 त्रुटियों या वास्तव में एक Drupal साइट के लिए काम करने के लिए एक vhost कॉन्फ़िगर करने के लिए एक ErrorDocument निर्देश प्राप्त करने में सक्षम हैं? उन निर्देशों को मेरे अनुभव में नजरअंदाज कर दिया गया, ड्रुपल ने त्रुटि को संभाल लिया।
cdmo

0

क्या आपने रिपोर्ट करने में त्रुटि की है? (व्यवस्थापक / कॉन्फ़िगरेशन / विकास / लॉगिंग -> त्रुटि संदेश प्रदर्शित करने के लिए सभी संदेश सेट करें )

डिफ़ॉल्ट रूप से, Drupal एक सुरक्षा सुविधा के रूप में एक WSOD दिखाता है।


काफी मजेदार, जो चालू है और मुझे अभी भी WSOD मिलता है।
टॉमी फोर्सस्ट्रॉम्म

उस स्थिति में यह एक MAMP समस्या है, न कि एक Drupal समस्या। Php.ini में त्रुटि रिपोर्टिंग को चालू करने का प्रयास करें ( forum.mamp.info/viewtopic.php?f=2&t=8077 ) डिफ़ॉल्ट रूप से त्रुटि प्रदर्शन MAMP में अक्षम है।
पैट्रिक केनी

1
मुझे ठीक से प्रदर्शित php त्रुटियाँ मिल सकती हैं। यह वास्तव में मुद्दा नहीं है। मैं त्रुटियों के होने पर कुछ अनुकूल दिखाना चाहता हूं, जैसे ट्विटर की फेल व्हेल। यह वह चीज है जो मैं नहीं कर सकता: 500-श्रृंखला त्रुटियों के लिए कस्टम त्रुटि पृष्ठ।
टॉमी फोर्सस्ट्रम

0

मुझे लगता है कि उत्तर "डॉक्स पढ़ें" है, https://www.drupal.org/node/195435 देखें

तो मूल रूप से आप नाम की टेम्प्लेट फाइल बना सकते हैं maintenance-page.tpl.phpऔर maintenance-page--offline.tpl.phpकुछ सेटिंग्स को हार्ड कोड में कर सकते हैं settings.php

संपादित करें:

इससे कोई फर्क नहीं पड़ता error_reportingहै कि आपने किस स्तर पर सेट किया है या आपने सेट display_errorsकिया है onया नहीं off। जब आपके पास एक maintenance-page--offline.tpl.phpफाइल होती है तो डेटाबेस के चले जाने पर Drupal इस पेज को प्रदर्शित करेगा। यह भी कोई फर्क नहीं पड़ता कि आपने /admin/config/development/loggingएडमिन साइड में क्या सेट किया है। यदि आपके पास सिंटैक्स त्रुटियां हैं, जो ओपी की स्थिति थी, जो वास्तव में 500 को ट्रिगर नहीं करेगी, तो यह 200 पीएचपी त्रुटि के साथ या तो php.ini display_errorसेट के आधार पर प्रदर्शित या छिपी होगी । ऐसा कोई तरीका नहीं है, जिसे मैं जानता हूं, आपके कस्टम कोड में आपके कस्टम त्रुटि हैंडलिंग तर्क को जोड़ने की आवश्यकता के अलावा अन्य।


मुझे यकीन नहीं है कि मैं यहां क्यों उतरा, यह वह जवाब है जो मैं उस समय तलाश रहा था जब मैंने इनाम निर्धारित किया था। ओपी के लिए एक नहीं, आप error_prepend सेट कर सकते हैं और मानक PHP त्रुटि नोटिस पर भी संलग्न कर सकते हैं, यदि आप अपने मानक त्रुटि पृष्ठ को और विस्तृत करना चाहते थे।
cdmo

0

सभी WSOD को किसी अन्य चीज़ से बदलने के लिए हैकिंग कोर की आवश्यकता होगी: आप ऐसा नहीं करना चाहते हैं। Drupal bootstrap.inc और त्रुटियाँ.in में अपने स्वयं के त्रुटि संचालकों को परिभाषित करता है। यदि आप उस कोड के साथ गड़बड़ कर रहे थे, तो आपको यह सुनिश्चित करना होगा कि आप उन सभी चीजों के लिए जिम्मेदार होंगे जो इस चरण में पहुंचते समय गलत हो सकती हैं (कोई डेटाबेस नहीं, कोई थीम इंजन नहीं, कोई थीम नहीं, कोई कॉन्फ़िगरेशन नहीं, आदि)।


कभी PHP के error_append और error_prepend विकल्पों का उपयोग करने की कोशिश की? हालांकि त्रुटि संदेश अभी भी प्रदर्शित होगा, ऐसा लगता है कि आप एक बहुत अच्छे 500 अनुभव प्रदान कर सकते हैं (दी गई, न कि सभी PHP त्रुटियां जो व्हाट्सएप को तकनीकी रूप से 500 सिंटेक्स त्रुटियों की तरह 500 प्रतिक्रिया का कारण बनाती हैं।)
cdmo

सच। किसी भी तरह से आप एक ही सामान्य बिंदु पर पहुँच जाते हैं: आप ऐसा नहीं कर सकते।
13

0

मैंने ऐसा करने के लिए सैंडबॉक्स प्रोजेक्ट बनाया ।

मैं HttpExceptionSubscriberBase को /src/EventSubscriber/fiveh सैकड़ोंEventSubscriber.php में विस्तारित करके इसे पूरा करने में सक्षम था

    <?php
namespace Drupal\five_hundred\EventSubscriber;

use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\Serializer\SerializerInterface;

class five_hundredEventSubscriber extends HttpExceptionSubscriberBase {

      public function __construct($stack) {

        if(
          (
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getCode() == 500
          )||(
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode() == 500
          )
        ){
            $response = new Response();
            $errorDocumentHtml = 'html here';
            $response->setContent($errorDocumentHtml);
            $response->setStatusCode(500, '500 Internal Server Error');
            $response->send();
            die();
        }
      }

      /**
       * {@inheritdoc}
       */
      protected function getHandledFormats() {
        return array('html','');
      }


    }
?>

और आपको अपने मॉड्यूल में सेवा को जोड़ना होगा। Services.yml

services:
  five_hundred.:
    class: Drupal\five_hundred\EventSubscriber\five_hundredEventSubscriber
    arguments: ['@request_stack']
    tags:
      - { name: event_subscriber }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.