सवाल किसी भी त्रुटि पर एक HTTP 500 कोड कैसे वापस करें, कोई फर्क नहीं पड़ता कि क्या


मैं PHP में एक प्रमाणीकरण स्क्रिप्ट लिख रहा हूं, जिसे एपीआई कहा जाता है, जिसे 200 लौटने की आवश्यकता हैonly in the case that it approves the request, and403(Forbidden) or500 'अन्यथा।

जिस समस्या में मैं दौड़ रहा हूं वह यह है कि PHP रिटर्न 200 त्रुटि स्थितियों के मामले में, त्रुटि को HTML के रूप में आउटपुट के रूप में आउटपुट करना। मैं पूरी तरह से कैसे सुनिश्चित कर सकता हूं कि PHP एक HTTP वापस कर देगा 500 कोड जब तक कि मैं स्पष्ट रूप से HTTP वापस नहीं करता 200 या HTTP 403 खुद? दूसरे शब्दों में, मैं किसी भी और सभी चेतावनी या त्रुटि की स्थिति को चालू करना चाहता हूं 500एस, कोई अपवाद नहीं है, ताकि डिफ़ॉल्ट मामला प्रमाणीकरण अनुरोध को अस्वीकार कर रहा है, और अपवाद इसे एक के साथ अनुमोदित कर रहा है 200 कोड।

मैंने साथ झुकाया है set_error_handler() तथा error_reporting(), लेकिन अब तक कोई भाग्य नहीं है। उदाहरण के लिए, यदि कोड HTTP प्रतिक्रिया कोड भेजने से पहले कोड आउटपुट करता है, तो PHP स्वाभाविक रूप से रिपोर्ट करता है कि आप कुछ भी आउटपुट करने के बाद हेडर जानकारी संशोधित नहीं कर सकते हैं। हालांकि, यह PHP द्वारा एक के रूप में रिपोर्ट किया गया है 200 समस्या को समझाते हुए एचटीएमएल के साथ प्रतिक्रिया कोड। मुझे इस तरह की चीज को एक में बदलने की जरूरत है 500 कोड।

क्या यह PHP में संभव है? या मुझे इसे उच्च स्तर पर उपयोग करने की तरह करना है mod_rewrite किसी न किसी तरह? यदि ऐसा है, तो कोई विचार है कि मैं इसे कैसे सेट अप करूं?


44
2018-06-16 11:11


मूल


इसके लिए यहां एक बग रिपोर्ट है: bugs.php.net/bug.php?id=50921 - यह ठीक हो सकता है जैसे यह तय हो सकता है। - Thomas Ahle


जवाब:


प्रतिक्रिया के रूप में बस स्थिति कोड भेजें header():

header('HTTP/1.1 500 Internal Server Error');

याद रखें कि इसे वहां भेजते समय बिलकुल मना है इससे पहले कोई आउटपुट हो। इसका मतलब है नहीं echo कॉल और कोई एचटीएमएल या व्हाइटस्पेस नहीं।


70
2018-06-16 11:12



यह भी याद रखें कि सीजीआई के रूप में या आईआईएस के तहत चलने पर यह काम नहीं करेगा। - Ignacio Vazquez-Abrams
धन्यवाद - मुझे पता है कि प्रतिक्रिया कोड कैसे भेजना है, और मुझे पता है कि इससे पहले कि मैं अपने प्रश्न में उल्लेख करता हूं, आउटपुट न भेजें। मेरा सवाल यह है कि PHP को त्रुटियों के मामले में एचटीएमएल के रूप में त्रुटि के साथ 200 प्रतिक्रिया कोड भेजने से कैसे रोकें। - Jake
इसे भेजें तो त्रुटि संदेश आउटपुट? एक स्टेटस हेडर भेजना डिफ़ॉल्ट को ओवरराइड करने के लिए PHP को बताता है 200 OK रेस्पोंस कोड। - BoltClock♦
बोल्टक्लॉक: अनचाहे अपवादों के मामले में आपको कैसे पता चलेगा कि हेडर क्या भेजना है? - Thomas Ahle
महान समाधान, हालांकि आजकल सभी बच्चे उपयोग कर रहे हैं http_response_code(500); हेडर सेट करने के लिए। - Ellesedil


मैंने जाँचा शीर्षलेख के लिए PHP दस्तावेज़ (), और यह आसान है कि मैं इसे बना रहा था - यदि दूसरा पैरामीटर सत्य है, तो यह एक समान शीर्षलेख को प्रतिस्थापित करेगा। डिफ़ॉल्ट सच है। तो सही व्यवहार हेडर है ('HTTP/1.1 403 Forbidden');, तो प्रमाणीकरण तर्क करें, फिर यदि यह प्रमाणित करता है, तो शीर्षलेख करें ('HTTP/1.1 200 OK')। यह 403 प्रतिक्रिया को प्रतिस्थापित करेगा, और गारंटी देगा कि 403 डिफ़ॉल्ट है।


20
2017-08-25 22:25



अच्छा काम, यह एक उत्कृष्ट समाधान है। - tpow


Set_error_handler () के लिए php पेज पर आप npastsoft dot com पर smp द्वारा एक टिप्पणी प्राप्त कर सकते हैं 08-Sep-2003 10:28 पर पोस्ट किया गया है जो कि घातक त्रुटियों को पकड़ने का तरीका बताता है (जिसे आप आमतौर पर कस्टम त्रुटि हैंडलर से नहीं पकड़ सकते हैं। मैंने आपके लिए कोड बदल दिया है:

error_reporting(E_ALL);
ini_set('display_errors', 'on');

function fatal_error_handler($buffer) {
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

function handle_error ($errno, $errstr, $errfile, $errline){
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

//would normally cause a fatal error, but instead our output handler will be called allowing us to handle the error.
somefunction();
ob_end_flush();

यह गैर मौजूदा कार्य की घातक त्रुटि को पकड़ता है। यह एक 500 रिटर्न से अधिक है और बाकी लिपि के निष्पादन को रोकता है।


11
2018-06-16 19:32



यह किसी भी त्रुटि को पकड़ लेगा लेकिन त्रुटियों को पार्स करेगा। - यह भी त्रुटि ट्रेस छुपाएगा, ताकि आप वही कार्य प्राप्त करने के लिए डिस्प्ले_एरर्स को अक्षम कर सकें। - Thomas Ahle
@ थॉमस आप हेडर सेट करने के बाद खुद को एक स्टैक ट्रेस आउटपुट कर सकते हैं - chacham15


चूंकि PHP 5.4.0 उस के लिए एक spezialized समारोह है http_response_code() अर्थात।:

<?php
  http_response_code(404);
?>

देख http://www.php.net/manual/en/function.http-response-code.php


11
2017-11-27 07:13



इसके लिए धन्यवाद! मुझे यह देखकर प्रसन्नता हो रही है कि PHP इस प्रकार की चीज़ के लिए अब एक सहायक काम है। - renoirb
निफ्टी को जानने के लिए, यह php को 200 ओके लौटने से रोक नहीं देता है जब यह किसी त्रुटि का सामना करता है। - Ellesedil
निश्चित रूप से, यह त्रुटि के लिए कोई प्रतिस्थापन नहीं है handling, यह त्रुटि है reporting - Martin M


header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

आपको 500 का उपयोग नहीं करना चाहिए, जो एक आंतरिक सर्वर त्रुटि इंगित करता है।

यह (और अन्य शीर्षलेख) किसी भी आउटपुट से पहले भेजा जाना चाहिए, सिवाय इसके कि आपके पास आउटपुट बफरिंग सक्षम है या नहीं।


5
2018-06-16 11:13



धन्यवाद, लेकिन यह मेरा सवाल नहीं है। मुझे पता है कि प्रतिक्रिया कोड कैसे भेजना है। मैं PHP को त्रुटियों के मामले में 200 कोड भेजने से कैसे रोकूं? - Jake
@ जेक अगर 403 प्रतिक्रिया भेजें, तो यह 200 नहीं भेजेगा। क्या मुझे कुछ याद आ रहा है? - Artefacto
समस्या यह है कि अगर यह 403 0r 200 भेजने के लिए पता है, तो यह त्रुटि त्रुटि के साथ 200 भेजता है, तो यह त्रुटि के साथ 200 भेजता है। मैं विपरीत व्यवहार चाहता हूं - मैं त्रुटि के मामले में 403 या 500 या 200 से अधिक कुछ भी होने के मामले में डिफ़ॉल्ट चाहता हूं, ताकि केवल 200 प्रतिक्रिया कोड भेज सकूं। मैं तुरंत 403 कोड लिखने की कोशिश करूंगा, और उसके बाद ओवरराइटिंग करूँगा कि 200 के साथ यह सफल होता है। मुझे नहीं पता कि इस मामले में व्यवहार क्या होना चाहिए। क्या कोई जानता है? क्या यह 403 को सही ढंग से ओवरराइट करेगा? - Jake


जिज्ञासा अगर आपने कभी पता लगाया कि PHP को पार्स त्रुटियों पर 500 वापस करने के लिए कैसे प्राप्त किया जाए ... मेरे पास एक ही सटीक आवश्यकता है ... एपीआई हमारे ऐप पर पोस्ट कर रही है और केवल 200 की अपेक्षा करता है अगर सबकुछ ठीक से संसाधित हो ...

पार्स त्रुटि के मामले में, PHP एक त्रुटि 200 देता है और मैंने इन दोनों कार्यों का उपयोग किया है:

register_shutdown_function () set_error_handler ()

और जब कोड में "पार्स / वाक्यविन्यास" त्रुटि होती है तो ये हिट नहीं होते हैं ...

तो यह एक निम्न स्तरीय PHP फ़ंक्शन है जिसे PHP.INI या कहीं भी सेट करना होगा ... मैं PHP 5.3.10 का उपयोग कर रहा हूं ...


2
2018-01-05 16:42





पेज के बॉडी को लिखने के बाद हेडर को संशोधित करने की अनुमति देने के लिए आउटपुट बफरिंग का उपयोग करें। आप इसे सेट कर सकते हैं आईएनआई फाइल प्रत्येक स्क्रिप्ट को अद्यतन करने के बजाय।

(नोट करें कि हेडर () कॉल अभी भी विफल हो जाएगी यदि आप स्पष्ट रूप से आउटपुट बफर को फ्लश करते हैं)

सी।


1
2018-06-16 16:28