2010-02-24 14 views
41

यह प्रश्न URL के क्वेरी स्ट्रिंग हिस्से में वर्णों से संबंधित है, जो ? मार्क वर्ण के बाद दिखाई देता है।HTTP क्वेरी स्ट्रिंग में कौन से वर्ण बचने चाहिए?

प्रति Wikipedia, कुछ वर्ण शेष हैं और अन्य एन्कोड किए गए हैं (आमतौर पर % भागने अनुक्रम के साथ)।

मैं इस वास्तविक विशिष्टताओं के लिए नीचे ट्रैक करने के लिए इतना है कि मुझे लगता है कि विकिपीडिया पृष्ठ में हर बुलेट बिंदु के पीछे औचित्य समझ में कोशिश कर रहा हूँ।

विरोधाभास उदाहरण 1:

HTML specification+ के रूप में एनकोड अंतरिक्ष के लिए कहते हैं और RFC1738 को आराम defers। हालांकि, यह आरएफसी कहता है कि ~ असुरक्षित है और इसके अलावा "[ए] असुरक्षित पात्रों को हमेशा यूआरएल के भीतर एन्कोड किया जाना चाहिए"। ऐसा लगता है कि विकिपीडिया का विरोधाभास है।

अभ्यास में, IE8 क्वेरी स्ट्रिंग उत्पन्न में ~ encodes, जबकि FF3 छोड़ देता है के रूप में।

विरोधाभास उदाहरण 2:

विकिपीडिया कहा गया है कि सभी पात्रों है कि यह उल्लेख नहीं है एन्कोड किया जाना चाहिए। विकिपीडिया में ! का उल्लेख नहीं है। लेकिन RFC1738 बताता है कि ! एक "विशेष" चरित्र है और "अनएन्कोडेड का उपयोग किया जा सकता है"। ऐसा लगता है कि विकिपीडिया का विरोधाभास है जो कहता है कि इसे एन्कोड किया जाना चाहिए।

अभ्यास में, IE8 क्वेरी स्ट्रिंग उत्पन्न में ! encodes, जबकि FF3 छोड़ देता है के रूप में।

मैं समझता हूं कि इसका नैतिकता शायद उन पात्रों को एन्कोड करने जा रहा है जो विकिपीडिया और विनिर्देशों के बीच संदेह में हैं। संभवतः यहां तक ​​कि एन्कोडिंग के रूप में भी जा रहा है जो [ए-ज़ा-जे 0-9] नहीं है। मैं बस इस पर वास्तविक मानकों को जानना चाहूंगा।

निष्कर्ष

एल्गोरिथ्म विकिपीडिया पर वर्णित ठीक उन अक्षरों जो RFC3986 unreserved characters नहीं हैं encodes। यही है, यह अल्फान्यूमेरिक्स और -._~ के अलावा सभी पात्रों को एन्कोड करता है। एक विशेष मामले के रूप में, अंतरिक्ष + के रूप में %20 प्रति RFC3986 के बजाय एन्कोड किया गया है।

कुछ अनुप्रयोग एक पुराने आरएफसी का उपयोग करें। तुलना के लिए, RFC2396 unreserved characters अल्फान्यूमेरिक्स और !'()*-._~ हैं।

तुलना के लिए, HTML5 working draft algorithm अल्फान्यूमेरिक्स और *-._ के अलावा सभी वर्णों को एन्कोड करता है। अंतरिक्ष के लिए विशेष केस एन्कोडिंग + बनी हुई है। उल्लेखनीय अंतर यह है कि * एन्कोड नहीं किया गया है और ~ एन्कोड किया गया है। (तकनीकी तौर पर, * के इस हैंडलिंग RFC3986 भले ही *reserved में है क्योंकि यह sub-delims जो query उत्पादन में अनुमति दी जाती है के साथ संगत है।)

+2

विकिपीडिया मानक मानकों का नहीं है। यदि संदेह में, मानक का उपयोग करें। –

+8

@ जॉन - हालांकि * सही * मानक का उपयोग करना महत्वपूर्ण है। इस मामले में 3 9 86 है, पुराना 1738 नहीं। –

उत्तर

37

जवाब RFC 3986 दस्तावेज़ में निहित है, विशेष रूप से Section 3.4

क्वेरी घटक पहला सवाल चिह्न ("?") चरित्र ने संकेत दिया है और एक संख्या चिह्न ("#") चरित्र द्वारा या यूआरआई के अंत तक समाप्त हो जाता है।

...

पात्रों स्लेश ("/") और प्रश्न चिह्न ("?") डेटा क्वेरी घटक भीतर प्रतिनिधित्व कर सकते हैं।

तकनीकी तौर पर, आरएफसी 3976-3.4 के रूप में क्वेरी घटक परिभाषित करता है:

query  = *(pchar/"/"/"?") 

इस वाक्य रचना का मतलब है कि क्वेरी pchar के साथ-साथ / और ? से सभी वर्ण हो सकते हैं। pchar पथ वर्णों के एक और विनिर्देश को संदर्भित करता है। काम आते हुए, आरएफसी के Appendix A 3986 सूचियों प्रासंगिक ABNF परिभाषाएँ, सबसे विशेष रूप से:

query   = *(pchar/"/"/"?") 
pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
pct-encoded = "%" HEXDIG HEXDIG 
sub-delims = "!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"=" 

इस प्रकार, सभी अक्षर या अंक और प्रतिशत एन्कोड किए गए वर्ण के अलावा, एक प्रश्न कर सकते हैं कानूनी तौर पर निम्नलिखित unencoded पात्रों में शामिल हैं:

/ ? : @ - . _ ~ ! $ & ' () * + , ; = 

बेशक, आप यह ध्यान में रखना चाहेंगे कि '=' और '&' आमतौर पर एक क्वेरी के भीतर विशेष महत्व है।

+2

नोट: '=' और '&' के अलावा, सर्वरसाइड अन्य कानूनी रूप से अनएन्कोड किए गए क्वेरी स्ट्रिंग वर्णों को प्रतिबंधित कर सकता है जैसे PHP में '.' (dot) जहां इसे एक' '_ _GET' और' $ _POST' में _' (अंडरस्कोर)। देखें: http://stackoverflow.com/questions/68651/get-php-to-stop-replacing-characters-in-get-or-post-arrays (एक वर्कअराउंड भी है)। – GitaarLAB

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