2010-05-04 14 views
18

लगभग हर उदाहरण मुझे क्यों मिल सकता है (लगभग एक साल पहले this question समेत) कहता है कि 404 हेडर HTTP/1.0 404 Not Found होना चाहिए जब हम वास्तव में एक दशक से अधिक HTTP 1.1 का उपयोग कर रहे हैं? क्या इसके बजाय HTTP/1.1 404 Not Found भेजने का कोई कारण नहीं है?404 हेडर - HTTP 1.0 या 1.1?

(यह बहुत वह सब मायने रखती है ऐसा नहीं है कि ... मैं ज्यादातर बस उत्सुक हूँ।)

+0

'1.0' के लिए लगभग 11 मिलियन Google परिणाम, लगभग 1.1 मिलियन के लिए 4.3 मिलियन परिणाम। मुझे लगता है कि इसका मतलब है '1.0' का उपयोग करें। –

+1

उस प्रश्न ने यह नहीं कहा कि हेडर HTTP/1.0 होना चाहिए। यह केवल उस उदाहरण में प्रयोग किया जाता था। तो मान लें =) – mauris

उत्तर

5

HTTP संस्करण का उपयोग निम्नलिखित कारकों पर आधारित हो सकते हैं:

  • आपका वेब HTTP 1.0 के लिए सर्वर समर्थन या 1.1
  • वेब ब्राउज़र के HTTP 1.0 या के लिए समर्थन 1।1
  • एक वेब डेवलपर, जिस पर प्रोटोकॉल संस्करण

आधुनिक ब्राउज़रों का उपयोग करने में अच्छी तरह से 1.0 और 1.1 दोनों का समर्थन कर सकते हैं, और दोनों क्लाइंट और सर्वर उच्चतम संस्करण दोनों एक साथ समर्थन कर सकते हैं के लिए समझौता होगा, क्योंकि आपकी प्राथमिकता। 2 प्रोटोकॉल के बीच महत्वपूर्ण अंतर पाया जा सकता है: http://www8.org/w8-papers/5c-protocols/key/key.html

हालांकि 404 के उपयोग में कोई महत्वपूर्ण अंतर नहीं है। हालांकि अपनी पूरी वेबसाइट के लिए संगत रहें। यानी यदि आप HTTP/1.1 का उपयोग करते हैं, तो आप इसे अपनी वेबसाइट पर उपयोग करते हैं।

1

दोनों 1.1 और 1.0 RFC, को देखते हुए, 404 दोनों में है - तो यह शायद अलावा कोई अन्य कारण के लिए है सर्वर के लिए क्लाइंट को संवाद करने के लिए कि यह http 1.1 पर चल रहा है।

यह कहा गया - यदि कोई सर्वर एचटीपी 1.1 पर 404 के साथ प्रतिक्रिया करता है, तो इसका तात्पर्य है कि यह 410 - Gone लौटा सकता है जो कि मौजूद संसाधन को इंगित करने के लिए लौटा सकता है लेकिन अब नहीं करता है। यह स्थिति कोड 1.0 का हिस्सा नहीं है, और इसलिए यह जानकारी किसी क्लाइंट (विशेष रूप से वेब क्रॉलर) के लिए उपयोगी हो सकती है।

संपादित

खेद है - इस जवाब शायद दूसरी तरह के आसपास का जवाब दे रहा है! मुझे लगता है कि आप शायद कुछ हाथों पर सार्वजनिक वेब सर्वरों की संख्या पर भरोसा कर सकते हैं जो मौजूद सभी संसाधनों को याद रखने के लिए परेशान होंगे और जो अब नहीं करते हैं (कोई भी तरीका नहीं है कि मैं अपने वेब सर्वर में कोड करूंगा!) - तो इसलिए यह संभवतः 1.0 404 के साथ जवाब देने के लिए सबसे अच्छा है कि यह 'यहां नहीं है' की बजाय 'यहां नहीं है', लेकिन साइट के आस-पास की अन्य चीजें हो सकती थीं लेकिन अब नहीं - इस मामले में मैं आपको भेज सकता था एक 410 '।

यह भी तथ्य है कि आप 1.0-केवल क्लाइंट को अपनी साइट के साथ काम करने की अनुमति दे रहे हैं।

उसने कहा - यह सब कुछ पैडेंटिक है।

2

इससे कोई फर्क नहीं पड़ता। क्लाइंट सर्वर को यह बताने के लिए ज़िम्मेदार है कि HTTP का कौन सा संस्करण इसका उपयोग करता है। फिर, सर्वर को उसी संस्करण के साथ जवाब देना चाहिए। यह हमेशा नहीं होता है; मैं सिर्फ एक सर्वर से इस प्रतिक्रिया मिली:

$ telnet example.com 80 
Trying 123.123.123.123... 
Connected to example.com. 
Escape character is '^]'. 
GET /fork HTTP/1.0 

HTTP/1.1 404 Not Found 
Content-Length: 1635 
Content-Type: text/html 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Date: Tue, 04 May 2010 22:30:36 GMT 
Connection: close 

मैं HTTP 1.0 का उपयोग करने के लिए सर्वर के लिए कहा है, लेकिन यह आगे चला गया और HTTP 1.1 के साथ जवाब दिया।

2

मैंने सोचा होगा कि अनुरोध HTTP/1.0 404 Not Found होना चाहिए यदि अनुरोध HTTP 1.0 था, और HTTP/1.1 404 Not Found यदि अनुरोध HTTP 1.1 था।

प्रैक्टिस में, सर्वर के लिए डिब्बाबंद प्रतिक्रियाओं को वापस करने के लिए यह आसान हो जाएगा, और HTTP 1.0 प्रतिक्रिया 1.0 और 1.1 दोनों क्लाइंट्स द्वारा समझा जाएगा, ताकि इसे वापस करने के लिए सुरक्षित हो। यदि आप जानते हैं कि क्लाइंट 1.1 समझता है (उदा। क्योंकि यह वही है जो उसने पूछा), तो 1.1 प्रतिक्रिया काम करनी चाहिए।

तर्कसंगत रूप से, इसे सुरक्षित खेलें और 1.0 प्रतिक्रिया भेजें।

+1

हाँ, 1.1 का उपयोग करने की कोई आवश्यकता नहीं है जब आप किसी भी 1.1 फीचर्स का उपयोग नहीं कर रहे हैं – Earlz

26

PHP में आप शायद का उपयोग करना चाहिए:

header($_SERVER['SERVER_PROTOCOL']." 404 Not Found", true); 

या और भी बेहतर

header($_ENV['SERVER_PROTOCOL']." 404 Not Found", true); 

(यदि समर्थित हो) और इस तरह वेब सर्वर जो प्रोटोकॉल का उपयोग करने के लिए इसे छोड़ दें।

दरअसल, यदि आप स्थिति कोड को तीसरे पैरामीटर के रूप में पास करते हैं, तो आप जो भी चाहें उसे पारित कर सकते हैं, जब तक कि यह खाली न हो, और PHP बाकी कर देगा। http://php.net/header

header("foobar", true, 404); 

भी देखें: आप कर सकते हैं नहीं अनुरोध लेन-देन के बाद क्लाइंट साइड से एक निश्चित प्रोटोकॉल संस्करण हॉप-से-हॉप आधारित है, और अंत से अंत नहीं। सर्वर और आपका ब्राउज़र HTTP/1.1 का बहुत अच्छा उपयोग कर सकता है, लेकिन यदि प्रॉक्सी इनबेटवीन केवल HTTP/1.0 का उपयोग कर रहा है, तो आप अपने क्लाइंट से यही देखेंगे।

+0

क्या ग्राहक द्वारा भेजे गए * कच्चे * हेडर को पकड़ने के लिए वैसे भी है? इसके द्वारा, मेरा मतलब लाइन हेडर द्वारा लाइन है। – Pacerier

+0

@Pacerier मुझे रॉ हेडर के बारे में पता नहीं है, लेकिन वे $ _SERVER सरणी का हिस्सा हैं। – DanMan

+0

नहीं मेरा मतलब है कि मैं सरणी में पार्स किए जाने से पहले टेक्स्ट हेडर प्राप्त करना चाहता हूं। – Pacerier

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