लॉगिन पेज पर रीडायरेक्ट करते समय सही HTTP स्टेटस कोड क्या है?


133

जब कोई उपयोगकर्ता लॉग इन नहीं होता है और लॉगिन की आवश्यकता वाले पृष्ठ तक पहुंचने का प्रयास करता है, तो लॉगिन पृष्ठ पर रीडायरेक्ट के लिए सही HTTP स्थिति कोड क्या है?

मैं पूछ रहा हूँ क्योंकि में से कोई भी 3xx प्रतिक्रिया कोड W3C द्वारा निर्धारित लग आवश्यकताओं फिट करने के लिए:

10.3.1 300 एकाधिक विकल्प

अनुरोधित संसाधन प्रतिनिधित्व के किसी एक सेट से मेल खाता है, प्रत्येक का अपना विशिष्ट स्थान है, और एजेंट द्वारा संचालित वार्ता जानकारी (खंड 12) प्रदान की जा रही है ताकि उपयोगकर्ता (या उपयोगकर्ता एजेंट) एक पसंदीदा प्रतिनिधित्व का चयन कर सके और उसका पुनर्निर्देशन कर सके। उस स्थान के लिए अनुरोध।

जब तक यह एक HEAD अनुरोध नहीं था, प्रतिक्रिया SHOULD में संसाधन विशेषताओं और स्थान (नों) की सूची वाली एक इकाई शामिल होती है जिसमें से उपयोगकर्ता या उपयोगकर्ता एजेंट सबसे उपयुक्त चुन सकते हैं। इकाई प्रारूप सामग्री प्रकार हेडर फ़ील्ड में दिए गए मीडिया प्रकार द्वारा निर्दिष्ट किया गया है। प्रारूप और की क्षमताओं पर निर्भर करता है

उपयोगकर्ता एजेंट, सबसे उपयुक्त विकल्प का चयन स्वचालित रूप से किया जा सकता है। हालांकि, यह विनिर्देश ऐसे स्वचालित चयन के लिए किसी भी मानक को परिभाषित नहीं करता है।

यदि सर्वर के पास प्रतिनिधित्व का पसंदीदा विकल्प है, तो वह स्थान क्षेत्र में उस प्रतिनिधित्व के लिए विशिष्ट URI को शामिल करता है; उपयोगकर्ता एजेंट स्वतः पुनर्निर्देशन के लिए स्थान फ़ील्ड मान का उपयोग करते हैं। जब तक अन्यथा इंगित न किया जाए, यह प्रतिक्रिया अस्वीकार्य है।

10.3.2 301 स्थायी रूप से स्थानांतरित

अनुरोधित संसाधन को एक नया स्थायी यूआरआई सौंपा गया है और भविष्य में इस संसाधन के किसी भी संदर्भ को लौटाए गए यूआरआई में से एक का उपयोग करना चाहिए। लिंक संपादन क्षमताओं वाले ग्राहकों को जहां संभव हो, सर्वर द्वारा वापस किए गए एक या अधिक नए संदर्भों के लिए अनुरोध-यूआरआई के संदर्भों को स्वचालित रूप से फिर से लिंक करना चाहिए। जब तक अन्यथा इंगित न किया जाए, यह प्रतिक्रिया अस्वीकार्य है।

नए स्थायी URI SHOULD को प्रतिक्रिया में स्थान फ़ील्ड द्वारा दिया जाएगा। जब तक अनुरोध विधि HEAD नहीं थी, प्रतिक्रिया की इकाई SHOULD में नए URI (s) के लिए हाइपरलिंक के साथ एक छोटा हाइपरटेक्स्ट नोट होता है।

यदि 301 स्थिति कोड GET या HEAD के अलावा किसी अन्य अनुरोध के जवाब में प्राप्त होता है, तो उपयोगकर्ता एजेंट को स्वचालित रूप से अनुरोध को पुनर्निर्देशित नहीं करना चाहिए जब तक कि उपयोगकर्ता द्वारा इसकी पुष्टि नहीं की जा सकती है, क्योंकि यह उन शर्तों को बदल सकता है जिनके तहत अनुरोध जारी किया गया था।

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302 मिला

अनुरोधित संसाधन अस्थायी रूप से एक अलग URI के तहत रहता है। चूंकि इस अवसर पर पुनर्निर्देशन में परिवर्तन किया जा सकता है, ग्राहक ग्राहक भविष्य के अनुरोधों के लिए अनुरोध-यूआरआई का उपयोग करना जारी रखेंगे। यदि कैश-कंट्रोल या समाप्ति शीर्ष लेख फ़ील्ड द्वारा इंगित किया गया है तो यह प्रतिक्रिया केवल देखने योग्य है।

प्रतिक्रिया में स्थान फ़ील्ड द्वारा अस्थायी URI SHOULD दिया जाना चाहिए। जब तक अनुरोध विधि HEAD नहीं थी, प्रतिक्रिया की इकाई SHOULD में नए URI (s) के लिए हाइपरलिंक के साथ एक छोटा हाइपरटेक्स्ट नोट होता है।

अगर GET या HEAD के अलावा किसी अन्य अनुरोध के जवाब में 302 स्टेटस कोड प्राप्त होता है, तो उपयोगकर्ता एजेंट को अनुरोध को स्वचालित रूप से तब तक रीडायरेक्ट नहीं करना चाहिए जब तक कि उपयोगकर्ता द्वारा इसकी पुष्टि नहीं की जा सकती है, क्योंकि यह उन शर्तों को बदल सकता है जिनके तहत अनुरोध जारी किया गया था।

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

मूल अनुरोध विधि की परवाह किए बिना, स्थान फ़ील्ड-मान पर GET का प्रदर्शन करते हुए, 303 प्रतिसाद थे। स्थिति कोड 303 और 307 उन सर्वरों के लिए जोड़े गए हैं जो स्पष्ट रूप से स्पष्ट करना चाहते हैं कि क्लाइंट को किस तरह की प्रतिक्रिया की उम्मीद है।

10.3.4 303 अन्य देखें

अनुरोध की प्रतिक्रिया एक अलग URI के तहत मिल सकती है और उस संसाधन पर GET विधि का उपयोग करके पुनर्प्राप्त किया जा सकता है। यह विधि मुख्य रूप से एक चयनित संसाधन के लिए उपयोगकर्ता एजेंट को पुनर्निर्देशित करने के लिए POST- सक्रिय स्क्रिप्ट के आउटपुट की अनुमति देने के लिए मौजूद है। नया यूआरआई मूल रूप से अनुरोधित संसाधन के लिए एक स्थानापन्न संदर्भ नहीं है। 303 प्रतिसाद को कैश नहीं किया जाना चाहिए, लेकिन दूसरे (पुनर्निर्देशित) अनुरोध के प्रतिसाद अस्वीकार्य हो सकता है।

प्रतिक्रिया में स्थान फ़ील्ड द्वारा भिन्न URI SHOULD दिया जाना चाहिए। जब तक अनुरोध विधि HEAD नहीं थी, प्रतिक्रिया की इकाई SHOULD में नए URI (s) के लिए हाइपरलिंक के साथ एक छोटा हाइपरटेक्स्ट नोट होता है।

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 304 संशोधित नहीं

यदि क्लाइंट ने सशर्त GET अनुरोध किया है और पहुंच की अनुमति है, लेकिन दस्तावेज़ को संशोधित नहीं किया गया है, तो सर्वर इस स्थिति कोड के साथ प्रतिक्रिया करेगा। 304 प्रतिसाद में एक संदेश-निकाय नहीं होना चाहिए, और इस तरह हमेशा शीर्ष लेख फ़ील्ड के बाद पहली खाली पंक्ति द्वारा समाप्त किया जाता है।

प्रतिक्रिया में निम्नलिखित हेडर फ़ील्ड शामिल होने चाहिए:

  - Date, unless its omission is required by section 14.18.1 If a

क्लॉकलेस ओरिजनल सर्वर इन नियमों का पालन करता है, और परदे के पीछे और क्लाइंट्स बिना किसी रिस्पॉन्स के अपनी डेट खुद जोड़ लेते हैं (जैसा कि पहले से ही [RFC 2068], सेक्शन 14.19 द्वारा निर्दिष्ट है), कैश सही तरीके से काम करेगा।

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

खंड 13.3.3), प्रतिक्रिया में अन्य संस्था-प्रमुख शामिल नहीं हैं। अन्यथा (यानी, सशर्त GET ने एक कमजोर सत्यापनकर्ता का उपयोग किया), प्रतिक्रिया में अन्य इकाई-हेडर शामिल नहीं होने चाहिए; यह कैश्ड इकाई-निकायों और अद्यतन हेडर के बीच विसंगतियों को रोकता है।

यदि 304 प्रतिसाद इंगित करता है कि कोई इकाई वर्तमान में कैश नहीं है, तो कैश को प्रतिक्रिया की अवहेलना करनी चाहिए और सशर्त के बिना अनुरोध को दोहराना चाहिए।

यदि कोई कैश प्रविष्टि को अद्यतन करने के लिए प्राप्त 304 प्रतिसाद का उपयोग करता है, तो प्रतिक्रिया में दिए गए किसी भी नए मान को प्रतिबिंबित करने के लिए संचय प्रविष्टि को अद्यतन करना चाहिए।

10.3.6 305 उपयोग प्रॉक्सी

अनुरोधित संसाधन को स्थान फ़ील्ड द्वारा दिए गए प्रॉक्सी के माध्यम से एक्सेस किया जाना चाहिए। स्थान फ़ील्ड प्रॉक्सी का URI देता है। प्राप्तकर्ता को प्रॉक्सी के माध्यम से इस एकल अनुरोध को दोहराने की उम्मीद है। 305 प्रतिक्रियाओं केवल मूल सर्वर द्वारा उत्पन्न किया जाना चाहिए।

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306 (अप्रयुक्त)

विनिर्देश के पिछले संस्करण में 306 स्थिति कोड का उपयोग किया गया था, अब इसका उपयोग नहीं किया जाता है, और कोड आरक्षित है।

10.3.8 307 अस्थाई पुनर्निर्देश

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

प्रतिक्रिया में स्थान फ़ील्ड द्वारा अस्थायी URI SHOULD दिया जाना चाहिए। जब तक अनुरोध विधि HEAD नहीं थी, प्रतिक्रिया की इकाई SHOULD में नए URI (s) के लिए हाइपरलिंक के साथ एक छोटा हाइपरटेक्स्ट नोट होता है, क्योंकि कई पूर्व HTTP / 1.1 उपयोगकर्ता एजेंट 307 स्थिति को नहीं समझते हैं। इसलिए, नोट SHOULD में नए URI पर मूल अनुरोध को दोहराने के लिए उपयोगकर्ता के लिए आवश्यक जानकारी होती है।

अगर G7 या HEAD के अलावा किसी अन्य अनुरोध के जवाब में 307 स्टेटस कोड प्राप्त होता है, तो उपयोगकर्ता एजेंट को अनुरोध को स्वचालित रूप से तब तक रीडायरेक्ट नहीं करना चाहिए जब तक कि उपयोगकर्ता द्वारा इसकी पुष्टि नहीं की जा सकती है, क्योंकि यह उन शर्तों को बदल सकता है जिनके तहत अनुरोध जारी किया गया था।

मैं अब तक 302 का उपयोग कर रहा हूं, जब तक मुझे सही उत्तर नहीं मिल जाता

अपडेट और निष्कर्ष:

HTTP 302 बेहतर है क्योंकि इसके ग्राहकों / ब्राउज़रों के साथ सर्वोत्तम अनुकूलता ज्ञात है।


1
मैं कहूंगा कि पुस्तक के माध्यम से बिल्कुल एक अनुप्रेषित के बिना 401 और लॉगिन पृष्ठ को वापस करना होगा, लेकिन मुझे यकीन नहीं है कि आपके विकल्प क्या हैं।
निक Craver

1
@ अच्छी बात है, लेकिन मैं उससे साइड इफेक्ट से डरूंगा अगर मैं एक क्लासिक लॉगिन सिस्टम बना रहा था।
पेकका

1
@Pekka - पूरी तरह से सहमत हैं, यह इस बात पर निर्भर करता है कि यह किस प्लेटफॉर्म पर है कि यह सब साफ-सुथरा कैसे किया जा सकता है, भले ही यह इंट्रानेट बनाम इंटरनेट खेलने में आता है मेरा मानना ​​है ... आप आम तौर पर इंट्रानेट पर एक अलग तरीके से प्रमाणीकरण करते हैं। कम से कम मेरे अनुभव में।
निक Craver

401 के साथ @ क्लिक करें "प्रतिक्रिया में डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर फ़ील्ड शामिल होना चाहिए" - मैं इसे MySQL डेटाबेस के साथ कैसे जोड़ सकता हूं? क्या AuthType बेसिक और डाइजेस्ट अपाचे कॉन्फिग फाइलों जैसे .htpassword आदि तक सीमित नहीं है ...?
विदुर वेस्टनेस

मुझे एक कस्टम लॉगिन-पेज चाहिए, न कि यूजर नेम और पासवर्ड मांगने वाला बेसिक ब्राउजर-डायलॉग ...
विदुर वेस्टनेस

जवाबों:


66

मैं कहूँगा 303 अन्य 302 देखें

अनुरोधित संसाधन अस्थायी रूप से एक अलग URI के तहत रहता है। चूंकि इस अवसर पर पुनर्निर्देशन में परिवर्तन किया जा सकता है , ग्राहक ग्राहक भविष्य के अनुरोधों के लिए अनुरोध-यूआरआई का उपयोग करना जारी रखेंगे। यह प्रतिक्रिया केवल कैचेबल है यदि कैचे-नियंत्रण या शीर्ष लेख फ़ील्ड द्वारा इंगित किया गया है।

मेरी राय में एक लॉगिन पृष्ठ सबसे अधिक निकटता से फिट बैठता है। मैंने शुरू में विचार 303 see otherकिया था कि जो भी काम करेगा। कुछ विचार के बाद, मैं कहूंगा 302 Foundकि अधिक उपयुक्त है क्योंकि अनुरोधित संसाधन पाया गया था , इससे पहले कि इसे एक्सेस किया जा सके, बस एक और पेज है। प्रतिक्रिया डिफ़ॉल्ट रूप से कैश नहीं होती है जो ठीक है।


4
मैं सहमत हूं, लेकिन मुझे लगता है कि 302 मिला इंगित करता है कि संसाधन पाया गया था, बस एक और यूआरएल के तहत। पूर्व। मैं 302 के साथ / मेरे संदेश / सर्वर का जवाब देना चाहता हूं क्योंकि "आज" मेरे संदेश "/ लॉगिन /" ("/ संदेश /" के बजाय) में स्थित हैं ... मैं 302 का उपयोग करता हूं, लेकिन मुझे नहीं लगता। संदर्भ 100% मिलान है। चूंकि लॉगिन-पेज एक अलग संसाधन है और इसमें अनुरोध के अनुसार सामग्री नहीं है।
विदुर वेस्टनेस

2
@PHP_Jedi सच। 303 उस दृष्टि से अधिक उपयुक्त हो सकता है। हालाँकि, क्लाइंट संगतता के मामले में 302 अधिक विश्वसनीय है।
पेक्का

1
हां, मैं सोच रहा हूं कि 303 संदर्भ बेहतर हो सकते हैं क्योंकि यह बताता है कि "अनुरोध की प्रतिक्रिया एक अलग यूआरआई के तहत मिल सकती है"। यह मुझे बता रहा है कि यह स्वयं संसाधन नहीं है जो किसी अन्य यूआरआई में पाया जाना है, लेकिन केवल इस अनुरोध की प्रतिक्रिया है।
विदुर वेस्टनेस

3
@PHP_Jedi मुझे यकीन नहीं है कि क्या इसमें इतना समय लगाने लायक है। Http दुनिया में क्लाइंट और सर्वर दोनों को वैसे भी बेहद उदार और दोष-सहिष्णु होना पड़ता है, इसलिए इसका कोई वास्तविक अंतर नहीं होगा कि आप इसका उपयोग करते हैं 302या नहीं 303, सिवाय इसके कि 302बेहतर ज्ञात है। मैं विस्तार के स्तर को सराहनीय मानता हूं और चीजों को सही तरीके से प्राप्त करना हमेशा अच्छा होता है, लेकिन इस विशिष्ट क्षेत्र में बहुत अधिक प्रयास व्यर्थ हो सकते हैं।
पाइका

28
FYI करें: Google 302s
डेविड मर्डोक

51

यह HTTP पुनर्निर्देशन तंत्र का दुरुपयोग है। यदि उपयोगकर्ता अधिकृत नहीं है तो आपका ऐप वापस आ जाना चाहिए 401 Unauthorized। उस स्थिति में जब उपयोगकर्ता अधिकृत है, लेकिन उसके पास अनुरोधित संसाधन तक पहुंच नहीं है, तो 403 Forbiddenउसे लौटा दिया जाना चाहिए।

आपको जावास्क्रिप्ट के द्वारा क्लाइंट साइड पर रीडायरेक्ट करना चाहिए। पुनर्निर्देशन के लिए स्थिति कोड क्योंकि आवश्यक प्राधिकरण मौजूद नहीं है । इसके लिए 30x का उपयोग करना HTTP के अनुरूप नहीं है।

मार्क नॉटिंघम द्वारा HTTP स्थिति कोड के बारे में कैसे सोचें

401 अनधिकृत रूप से HTTP के अनुरोध प्रमाणीकरण तंत्र को ट्रिगर करता है।

401 Unauthorizedस्थिति कोड के लिए WWW-Authenticateविभिन्न प्रमाणीकरण प्रकारों का समर्थन करने वाले शीर्ष लेख की उपस्थिति आवश्यक है :

WWW-Authenticate: <type> realm = <realm>

बियरर, OAuth, बेसिक, डाइजेस्ट, कुकी, आदि


20
401 कुछ मामलों में A server generating a 401 (Unauthorized) response MUST send a WWW-Authenticate header field( RFC ) के रूप में उपयुक्त नहीं हो सकता है , और सभी लॉगिन सिस्टम उस हेडर का उपयोग नहीं करते हैं।
स्टारबिम्रेनबोलाब्स

6
मान लीजिए आप एक संरक्षित पृष्ठ को ताज़ा कर रहे हैं; क्लाइंट साइड जावास्क्रिप्ट को कॉल करने के लिए कोई बदलाव नहीं होगा, और ब्राउज़र उपयोगकर्ता को लॉगिन पेज की ओर रीडायरेक्ट करने के बजाय एक लॉगिन विंडो पॉपअप करेगा - इसलिए एकमात्र तरीका 30x कोड का उपयोग करना है।
क्लाड ब्रिसन

2
गोलंग पुनर्निर्देशन के लिए 401 का उपयोग नहीं कर सकता है। इसका मतलब है कि हमें पुनर्निर्देशन के लिए 30 * का उपयोग करना चाहिए।
EIMEI

4
@ आपके समय के बाद, यदि किसी अन्य भाषा या लाइब्रेरी ने आपको 401 का उपयोग करने के लिए मजबूर किया है, तो इंटरनेट बर्बाद हो जाएगा। मेरी बात: आप जो कहते हैं, वह गोलंग के साथ एक समस्या की ओर इशारा करता है (हालांकि मुझे आश्चर्य है कि यह ऐसा डिजाइन होगा जिससे 401 भेजना असंभव हो जाएगा!)
ग्रेग

2
@starbeamrainbowlabs WWW- प्रामाणिक शीर्ष लेख में एक विकल्प के रूप में कुकी-आधारित HTTP प्रमाणीकरण के लिए एक मसौदा है। देखें: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef

12

मुझे लगता है कि उचित समाधान HTTP 401 (अधिकृत नहीं) हैडर है।

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

इस हैडर का उद्देश्य ठीक यही है। लेकिन, लॉगिन पृष्ठ पर पुनर्निर्देशित करने के बजाय, सही प्रक्रिया कुछ इस तरह होगी:

  • उपयोगकर्ता लॉग नहीं किया गया लॉगिन-प्रतिबंधित पृष्ठ तक पहुंचने का प्रयास करें।
  • सिस्टम पहचानता है कि उपयोगकर्ता लॉग नहीं है
  • सिस्टम HTTP 401 हेडर लौटाता है, और उसी प्रतिक्रिया में लॉगिन फ़ॉर्म प्रदर्शित करता है (रीडायरेक्ट नहीं)।

यह एक अच्छा अभ्यास है, जैसे साइटमैप लिंक के साथ उपयोगी 404 पृष्ठ और उदाहरण के लिए एक खोज फ़ॉर्म प्रदान करना।

फिर मिलते हैं।


20
आरएफसी में कहा गया है: "प्रतिक्रिया के लिए अनुरोध किए गए संसाधन पर लागू एक डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर फ़ील्ड (धारा 14.46) एक चुनौती से युक्त होता है।" एक HTTP प्रमाणीकरण योजना का उपयोग करते समय 401 की प्रतिक्रिया वास्तव में केवल लागू होती है।
बर्कलेट बटालू

4
उस स्थिति में 403 बेहतर होगा क्योंकि यह बताता है कि अभिगमन केवल निषिद्ध है और प्राधिकरण हेडर अभ्यस्त मदद
ओलानॉड

@bshacklett WWW-Authenticate का उपयोग कई प्रमाणीकरण योजनाओं (जैसे बियरर, OAuth) के साथ किया जा सकता है। डेवलपर देखें।
pmillailla.org/en-US/docs/Web/HTTP/Headers/…

WWW-Authenticate हेडर में एक विकल्प के रूप में कुकी-आधारित HTTP प्रमाणीकरण के लिए एक मसौदा है। देखें: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.