HTTP में POST पुनर्निर्देशित क्यों नहीं है?


162

HTTP पुनर्निर्देशन HTTP कोड 301, और 302 (शायद अन्य कोड भी) और एक हेडर फ़ील्ड के माध्यम से किया जाता है जिसे "स्थान" के रूप में जाना जाता है जिसमें जाने के लिए नई जगह का पता होता है। हालाँकि, ब्राउज़र हमेशा उस URL पर "GET" अनुरोध भेजते हैं।

हालांकि, कई बार आपको POST (उदाहरण के लिए बैंक भुगतान) के माध्यम से अपने उपयोगकर्ता को किसी अन्य डोमेन पर पुनर्निर्देशित करना होगा। यह एक सामान्य परिदृश्य है, और वास्तव में एक आवश्यकता है। क्या किसी को पता है कि HTTP विनिर्देश में ऐसी सामान्य आवश्यकता की उपेक्षा क्यों की गई है? लक्ष्य स्थान ( स्थान हेडर फ़ील्ड का मान) पर सेट और लक्षित स्थान setTimeoutपर फ़ॉर्म सबमिट करने के लिए उपयोग के साथ वर्कअराउंड फॉर्म (छिपे हुए क्षेत्रों में मापदंडों के साथ) भेजना है ।


1
क्या स्थिति कोड 307 आप देख रहे हैं? नीचे मेरा जवाब देखें।
डेविड रट्टका

जवाबों:


180

HTTP 1.1 में, वास्तव में एक स्थिति कोड ( 307 ) है जो इंगित करता है कि अनुरोध को उसी पद्धति और डेटा का उपयोग करके दोहराया जाना चाहिए ।

जैसा कि अन्य लोगों ने कहा है, यहां दुरुपयोग की संभावना है जो हो सकता है कि कई ढांचे 301 और 302 में उनके अमूर्त में चिपके हों। हालांकि, उचित समझ और जिम्मेदार उपयोग के साथ, आपको वह हासिल करने में सक्षम होना चाहिए जो आप खोज रहे हैं।

ध्यान दें कि W3.org कल्पना के अनुसार , जब METHODवह नहीं है HEADया GET, उपयोगकर्ता एजेंटों को नए स्थान पर अनुरोध को फिर से निष्पादित करने से पहले उपयोगकर्ता को संकेत देना चाहिए । आपको उपयोगकर्ता के लिए एक नोटबैक और फ़ॉलबैक मैकेनिज्म भी प्रदान करना चाहिए , यदि पुराने उपयोगकर्ता एजेंट सुनिश्चित नहीं हैं कि 307 के साथ क्या करना है।

इस फॉर्म का उपयोग करना:

<form action="Test307.aspx" method="post">
    <input type="hidden" name="test" value="the test" />
    <input type="submit" value="test" />    
</form>

और Test307.aspx वाले स्थान के साथ बस 307 लौटाते हैं: http://google.com , Chrome 13 और फ़िडलर पुष्टि करते हैं कि "परीक्षण = परीक्षण" वास्तव में Google पर पोस्ट किया गया है। बेशक आगे की प्रतिक्रिया 405 है क्योंकि Google POST की अनुमति नहीं देता है, लेकिन यह यांत्रिकी दिखाता है।

अधिक जानकारी के लिए HTTP स्थिति कोड और W3.org युक्ति की सूची देखें ।

307 अस्थायी पुनर्निर्देशन (HTTP / 1.1 के बाद से) इस अवसर में, अनुरोध को दूसरे URI के साथ दोहराया जाना चाहिए, लेकिन भविष्य के अनुरोध अभी भी मूल URI का उपयोग कर सकते हैं। 2 303 के विपरीत, मूल अनुरोध को फिर से जारी करते समय अनुरोध विधि को नहीं बदला जाना चाहिए। उदाहरण के लिए, एक POST अनुरोध को दूसरे POST अनुरोध का उपयोग करके दोहराया जाना चाहिए।


2
@DavidRuttka, जंगली में ब्राउज़र का समर्थन क्या है ?
पचेरियर

5
@DavidRuttka आप अपने जवाब को अपडेट करने के लिए rfc7231 को ध्यान में रखना चाहते हैं (obsoletes rfc2616)। उपयोगकर्ता को प्रेरित करना rfc2616 में एक आवश्यकता पर आधारित है। इस आवश्यकता को rfc7231 में छोड़ दिया जाता है और rfc7231 भी इस आवश्यकता का परिचय देता है कि 307 रीडायरेक्ट को अनुरोध विधि (जिसे आप अपने उद्धरण में अपने उत्तर के अंत में उल्लेख करते हैं) को बदलना नहीं चाहिए।
निबेरियस

ध्यान दें कि tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html के अनुसार "HTTP रीडायरेक्ट कोड 301-306 SHOULD का उपयोग तब तक नहीं किया जाना चाहिए जब तक कि सेवा प्रदाता को यह पता न चल जाए कि ग्राहक वास्तव में उपयोगकर्ता है- एजेंट "तो ऐसा लगता है कि 301 सेवाओं को 301 के बजाय 308 का उपयोग करना चाहिए। हालांकि यह केवल एक मसौदा है।
ब्रूस एडम्स

49

मुझे इस पृष्ठ पर यहाँ एक अच्छी व्याख्या मिली ।

डब्ल्यूडब्ल्यूडब्ल्यू पर सबसे सरल स्थितियां "बेमतलब" लेनदेन हैं, अर्थात जिन्हें बिना किसी नुकसान के दोहराया जा सकता है। ये आम तौर पर "GET" लेनदेन होते हैं, या तो क्योंकि वे सीधे URL संदर्भों (जैसे href = या src = HTML में विशेषताएँ) की पुनर्प्राप्ति हैं, या क्योंकि वे GET विधि का उपयोग करके प्रपत्र प्रस्तुतियाँ हैं। उस तरह का लेन-देन पुनर्निर्देशित करना सीधा है, और कोई भी प्रश्न नहीं पूछा गया: ग्राहक को पुनर्निर्देशन प्रतिक्रिया प्राप्त होती है, जिसमें एक स्थान शामिल है: शीर्ष लेख जो नए URL को निर्दिष्ट करता है, और ग्राहक नए URL पर लेनदेन को फिर से जारी करके उस पर प्रतिक्रिया करता है। उनके निहित कैचबिलिटी में इन पुनर्निर्देशन से जुड़े विभिन्न 30x स्थिति कोडों के बीच अंतर है, लेकिन अन्यथा वे जीईटी अनुरोधों के जवाब में मूल रूप से समान (301 और 302) हैं।

पोस्ट ट्रांजेक्शन अलग-अलग होते हैं, क्योंकि इन्हें सिद्धांत रूप में, नॉन-इम्पोटेंट (जैसे कि पिज्जा ऑर्डर करना, वोट डालना या जो भी हो) के रूप में परिभाषित किया गया है और मनमाने ढंग से दोहराया नहीं जाना चाहिए।

HTTP प्रोटोकॉल विनिर्देशों को इस अंतर को ध्यान में रखते हुए डिज़ाइन किया गया है: GET पद्धति को स्वाभाविक रूप से परिभाषित किया गया है, जबकि POST विधि को कम से कम संभावित रूप से, गैर-बेरोजगार के रूप में परिभाषित किया गया है; विशिष्टताओं ने क्लाइंट एजेंटों (जैसे कि ब्राउज़र) द्वारा अनजाने में (re) उपयोगकर्ताओं को बचाने के लिए एक POST ट्रांज़ेक्शन प्रस्तुत करने के लिए, जिसे उन्होंने इरादा नहीं किया था, या एक POST को एक ऐसे संदर्भ में सबमिट करना था जिसे वे नहीं चाहते थे। ।

हालांकि मैं उपयोगकर्ताओं को तकनीकी रूप से प्रतिबंधित करने का प्रशंसक नहीं हूं, ताकि उन्हें अवांछित हाथापाई करने या उनके अनुप्रयोगों को अवांछित नुकसान पहुंचाने से रोका जा सके, मैं बात समझ सकता हूं और यह समझ में आता है।


बहुत से तर्क उन दिनों में जाते हैं जब इंटरब्यूटल्स धीमे और अविश्वसनीय थे (जो वे अभी भी दुनिया के कई स्थानों में हैं)। मुझे स्पष्ट रूप से याद है कि जब मैंने डायल अप का उपयोग किया था और जब भी किसी और ने फोन उठाया तो बेतरतीब ढंग से डिस्कनेक्ट हो जाएगा। पृष्ठ को फिर से लोड करना और यह देखना बेहतर था कि चीजों को फिर से शुरू करने और दो बार एक ही कार्रवाई करने के जोखिम को चलाने के लिए सर्वर किस स्थिति में था।
zzzzBov

@ फाल्कन, क्या "आगंतुक काउंटर" को गैर-बेरोजगार माना जाएगा? यदि हां, तो इन दिनों लगभग कोई भी वेबसाइट
बेकार GETs नहीं करती है

@Pacerier: आमतौर पर idempotent को "अर्थपूर्ण तरीके से अर्थपूर्ण" माना जाता है, उदाहरण के लिए, एक ही वस्तु को दो बार खरीदना, दो यात्राओं को देखना नहीं। अन्यथा, आप काफी सही होंगे। लेकिन वास्तव में, कल्पना के लिए सर्वर को आवश्यक रूप से उदासीन होना चाहिए, जैसे कि नकल रोकने के लिए पृष्ठ में एक आईडी एम्बेड करना - उपयोगकर्ता को एक प्रश्न पूछने के लिए ब्राउज़र की आवश्यकता नहीं होती है, जिसका किसी भी सटीकता के साथ जवाब देने का कोई तरीका नहीं है। भले ही, POST के पुनर्निर्देश को रोकने से बेरोजगारी प्रभावित न हो; यह केवल एक संदेश है जो अनुरोध के लक्ष्य को वास्तव में वहाँ पर है।
लॉरेंस डोल

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

@Flacon, मुझे सबूत चाहिए कि POST के साथ पुनर्निर्देशन को प्रतिबंधित करने से किसी भी संबंध में तबाही को रोका जा सकता है। चूँकि मुझे पहली बार अपने डेटा के साथ ऐप पर भरोसा करना है, वे डेटा रखने के बाद कभी भी ऐसा कर सकते हैं। और मुझे नहीं लगता कि POST के अनुरोध की तुलना में रीडायरेक्ट अधिक असुरक्षित हैं।
b01

3

GET (और कुछ अन्य तरीके) को http युक्ति ( RFC 2616 ) में 'सेफ' के रूप में परिभाषित किया गया है :

9.1.1 सुरक्षित तरीके

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

विशेष रूप से, सम्मेलन की स्थापना की गई है कि GET और HEAD विधियां SHOULD में पुनर्प्राप्ति के अलावा अन्य कार्रवाई करने का महत्व नहीं है। इन तरीकों को "सुरक्षित" माना जाना चाहिए। यह उपयोगकर्ता एजेंटों को POST, PUT और DELETE जैसे अन्य तरीकों का प्रतिनिधित्व करने की अनुमति देता है, विशेष तरीके से, ताकि उपयोगकर्ता को इस तथ्य से अवगत कराया जाए कि संभवतः असुरक्षित कार्रवाई का अनुरोध किया जा रहा है।

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

इसका अर्थ है कि GET अनुरोध में उपयोगकर्ता के लिए कभी भी कोई गंभीर परिणाम नहीं होना चाहिए, कुछ ऐसा देखने से परे जिसे वे देखना नहीं चाहते, लेकिन POST अनुरोध एक संसाधन को बदल सकता है जो उनके लिए महत्वपूर्ण है, या अन्य लोगों के लिए।

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

मुझे यह भी नहीं लगता कि POST को पुनर्निर्देशित करना कभी भी आवश्यक होना चाहिए। किसी भी कार्य को करने की आवश्यकता है जो संभवतः सर्वर साइड कोड के भीतर एक फ़ंक्शन को कॉल करके किया जा सकता है, या यदि इसे किसी भिन्न सर्वर पर होने की आवश्यकता है, तो इसके बजाय ब्राउज़र को POST, सर्वर के लिए एक URL युक्त रीडायरेक्ट भेजने के बजाय उपयोगकर्ता के लिए एक प्रॉक्सी की तरह कार्य करते हुए, उस सर्वर से खुद ही अनुरोध कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.