2010-06-16 11 views
39

मैं PHP में एक प्रमाणीकरण स्क्रिप्ट लिख रहा हूं, जिसे एपीआई कहा जाता है, जिसे 200 500` अन्यथा वापस करने की आवश्यकता है।किसी भी त्रुटि पर HTTP 500 कोड को वापस कैसे करें, कोई फर्क नहीं पड़ता कि

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

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

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

+1

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

उत्तर

20

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

+0

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

63

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

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

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

+5

यह भी याद रखें कि सीजीआई के रूप में या आईआईएस के तहत चलने पर यह काम नहीं करेगा। –

+1

धन्यवाद - मुझे पता है कि प्रतिक्रिया कोड कैसे भेजना है, और मुझे पता है कि इससे पहले कि मैं अपने प्रश्न में उल्लेख करता हूं, आउटपुट न भेजें। मेरा सवाल यह है कि PHP को त्रुटियों के मामले में एचटीएमएल के रूप में त्रुटि के साथ 200 प्रतिक्रिया कोड भेजने से कैसे रोकें। – Jake

+0

इसे भेजें तो त्रुटि संदेश आउटपुट? एक स्टेटस हेडर भेजना PHP को डिफ़ॉल्ट '200 ओके' प्रतिक्रिया कोड ओवरराइड करने के लिए कहता है। – BoltClock

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

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

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

+0

धन्यवाद, लेकिन यह मेरा सवाल नहीं है। मुझे पता है कि प्रतिक्रिया कोड कैसे भेजना है। मैं PHP को त्रुटियों के मामले में 200 कोड भेजने से कैसे रोकूं? – Jake

+0

@ जेक अगर 403 प्रतिक्रिया भेजें, तो यह 200 नहीं भेजेगा। क्या मुझे कुछ याद आ रहा है? – Artefacto

+0

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

1

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

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

सी

10

set_error_handler के लिए (php पृष्ठ पर) आप ncoastsoft डॉट पर SMP द्वारा एक टिप्पणी पा सकते हैं । कॉम 08 सितम्बर 2003 10:28 जो exlpains कैसे भी घातक त्रुटियों (जो आप सामान्य रूप से एक कस्टम त्रुटि हैंडलर के साथ नहीं पकड़ सकते पकड़ने के लिए पर पोस्ट मैं तुम्हारे लिए कोड बदल की जरूरत है:

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

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

+0

यह किसी भी त्रुटि को पकड़ लेगा लेकिन त्रुटियों को पार्स करेगा। - यह भी त्रुटि ट्रेस छुपाएगा, ताकि आप वही कार्य प्राप्त करने के लिए डिस्प्ले_एरर्स को अक्षम कर सकें। –

+0

@ थॉमसएहल आप हेडर सेट करने के बाद खुद को एक स्टैक ट्रेस आउटपुट कर सकते हैं – chacham15

1

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

एक पार्स त्रुटि के मामले में, पीएचपी एक त्रुटि 200 वापस आती है और मैं इन कार्यों में से दोनों का इस्तेमाल किया है:

register_shutdown_function() set_error_handler()

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

तो यह एक निम्न स्तर पीएचपी समारोह php.ini में स्थापित किया जाना या कहीं ... मैं PHP 5.3.10 का उपयोग कर रहा होगा ...

9

पीएचपी 5.4.0 के बाद से वहाँ एक है कि http_response_code() यानी के लिए spezialized समारोह:

<?php 
    http_response_code(404); 
?> 

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

+1

इसके लिए धन्यवाद! मुझे यह देखकर प्रसन्नता हो रही है कि PHP इस प्रकार की चीज़ के लिए अब एक सहायक काम है। – renoirb

+0

निफ्टी को जानने के दौरान, यह किसी त्रुटि को सामना करते समय 200 ओके लौटने से PHP को रोक नहीं देता है। – Ellesedil

+0

यकीन है कि त्रुटि 'हैंडलिंग' के लिए कोई प्रतिस्थापन नहीं है, यह त्रुटि' रिपोर्टिंग 'है –

संबंधित मुद्दे