URI क्वेरी में क्या मान्य है और क्या नहीं?


100

पृष्ठभूमि (आगे सवाल नीचे)

मैं इसे आगे पीछे करने के लिए RFCs और SO पढ़ने की कोशिश कर रहा हूं, इसे क्रैक करने की कोशिश कर रहा हूं, लेकिन मुझे अभी भी जैक नहीं मिला है।

इसलिए मुझे लगता है कि हम सिर्फ "सर्वश्रेष्ठ" उत्तर के लिए वोट देते हैं और यह है, या?

मूल रूप से यह इस पर फोड़ा है।

3.4। क्वेरी घटक

क्वेरी घटक संसाधन द्वारा व्याख्या की जाने वाली जानकारी का एक स्ट्रिंग है।

query = *uric

एक क्वेरी घटक के भीतर, वर्ण ",", "/", "?", ":", "@", "&", "=", "+", "," और "$" आरक्षित हैं।

पहली बात जो मुझे चकित करती है वह यह है कि * यूरिक को इस तरह परिभाषित किया जाता है

uric = reserved | unreserved | escaped

reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","

यह हालांकि कुछ पैराग्राफों द्वारा स्पष्ट किया गया है जैसे कि

ऊपर "आरक्षित" सिंटैक्स वर्ग उन वर्णों को संदर्भित करता है जो एक यूआरआई के भीतर अनुमत होते हैं, लेकिन जो सामान्य यूआरआई सिंटैक्स के किसी विशेष घटक के भीतर अनुमति नहीं दी जा सकती है; उनका उपयोग धारा 3 में वर्णित घटकों के परिसीमन के रूप में किया जाता है।

"आरक्षित" सेट में वर्ण सभी संदर्भों में आरक्षित नहीं हैं। किसी भी यूआरआई घटक के भीतर वास्तव में आरक्षित वर्णों का समूह उस घटक द्वारा परिभाषित किया गया है। सामान्य तौर पर, यदि URI के ASCII एन्कोडिंग एन्कोडिंग के साथ चरित्र को बदल दिया जाता है, तो एक वर्ण आरक्षित होता है, यदि URI का शब्दार्थ बदल जाता है।

यह अंतिम अंश कुछ पीछे की ओर महसूस होता है, लेकिन यह स्पष्ट रूप से बताता है कि आरक्षित वर्ण सेट संदर्भ पर निर्भर करता है। फिर भी 3.4 बताता है कि सभी आरक्षित वर्ण एक क्वेरी घटक के भीतर आरक्षित हैं, हालांकि, केवल वही चीजें जो यहां शब्दार्थ को बदल देंगी, प्रश्न चिह्न (?) से बच रही है क्योंकि यूआरआई एक क्वेरी स्ट्रिंग की अवधारणा को परिभाषित नहीं करते हैं।

इस बिंदु पर मैंने RFC पर पूरी तरह से छोड़ दिया है लेकिन RFC 1738 विशेष रूप से दिलचस्प पाया।

एक HTTP URL फॉर्म लेता है:

http://<host>:<port>/<path>?<searchpart>

<पथ> और <खोजकर्ता घटक के भीतर, "/", ",?", "?" आरक्षित हैं। "/" वर्ण का उपयोग HTTP के भीतर एक श्रेणीबद्ध संरचना को नामित करने के लिए किया जा सकता है।

मैं कम से कम HTTP URL के संबंध में यह व्याख्या करता हूं कि RFC 1738 RFC 2396 को अधिगृहीत करता है। क्योंकि URI क्वेरी में क्वेरी स्ट्रिंग की कोई भी धारणा नहीं है, आरक्षित की व्याख्या वास्तव में मुझे क्वेरी स्ट्रिंग को परिभाषित करने की अनुमति नहीं देती है जैसा कि मुझे उपयोग किया जाता है। अब तक कर रहे हैं।

सवाल

यह सब तब शुरू हुआ जब मैं दूसरे संसाधन के अनुरोध के साथ संख्याओं की एक सूची पास करना चाहता था। मैं इसके बारे में ज्यादा नहीं सोचता था, और बस इसे अल्पविराम द्वारा अलग किए गए मानों के रूप में पारित करता था। मेरे आश्चर्य से हालांकि कोमा बच गया था। page.html?q=1,2,3एन्कोड किया गया क्वेरी page.html?q=1%2C2%2C3काम में बदल गया , लेकिन यह बदसूरत है और इसकी उम्मीद नहीं थी। तभी मैंने RFC से गुजरना शुरू किया।

मेरा पहला सवाल यह है कि क्या वास्तव में कॉमा को एन्कोडिंग करना आवश्यक है?

मेरा जवाब, RFC 2396 के अनुसार: हाँ, RFC 1738 के अनुसार: नहीं

बाद में मुझे अनुरोधों के बीच सूचियों के पारित होने के संबंध में संबंधित पोस्ट मिलीं। जहां सीएसवी दृष्टिकोण खराब के रूप में तैयार किया गया था। इसके बजाय यह दिखा, (इससे पहले यह नहीं देखा गया है)।

page.html?q=1;q=2;q=3

मेरा दूसरा प्रश्न, क्या यह एक मान्य URL है?

मेरा जवाब, RFC 2396 के अनुसार: नहीं, RFC 1738 के अनुसार: नहीं (; आरक्षित है)

जब तक यह संख्या है, तब तक सीएसवी को पास करने के साथ मेरे पास कोई समस्या नहीं है, लेकिन हाँ यदि आप कॉमा को अचानक किसी और चीज की आवश्यकता होती है, तो आप आगे और पीछे के मानों को एनकोड और डिकोड करने के जोखिम में दौड़ते हैं। वैसे भी मैंने ASP.NET के साथ अर्ध-कोलन क्वेरी स्ट्रिंग स्ट्रिंग की कोशिश की और परिणाम वह नहीं था जिसकी मुझे उम्मीद थी।

Default.aspx?a=1;a=2&b=1&a=3

Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"

मैं यह देखने में विफल हूं कि यह एक सीएसवी दृष्टिकोण से कैसे भिन्न होता है जब मैं "ए" के लिए पूछता हूं तो मुझे इसमें कॉमा के साथ एक स्ट्रिंग मिलती है। ASP.NET निश्चित रूप से एक संदर्भ कार्यान्वयन नहीं है, लेकिन इसने मुझे अभी तक निराश नहीं किया है।

लेकिन सबसे महत्वपूर्ण बात - मेरा तीसरा प्रश्न - इसके लिए विनिर्देश कहाँ है? और आप क्या करेंगे या उस मामले के लिए नहीं करेंगे?


RFC 1738 RFC 2396 को कैसे रोक सकता है, जब RFC 2396 को लगभग 4 साल बाद प्रकाशित किया गया था?
मैथ्यू फ्लैशेन

1
URL के संबंध में और जो व्यावहारिक रूप से समझ में आता है, वह मेरी व्याख्या है जो वह करता है। (सुपरसेड शायद सही शब्द नहीं है, क्योंकि इसका उपयोग RFC शब्दावली में पुराने RFC को अपदस्थ करने के लिए किया गया है, RFC 1738 को यह सब तब नहीं लगता है जब यह एकमात्र ऐसा युक्ति है जो अगर पाया जाता है जो आपको खोजकर्ता में क्वेरी स्ट्रिंग डालने की अनुमति देता है। URL का)
जॉन लेडिग्रेन

जवाबों:


69

यह वर्ण जेनेरिक URL घटक के भीतर आरक्षित है इसका मतलब यह नहीं है कि यह घटक के भीतर या घटक में डेटा के प्रकट होने पर बच जाना चाहिए। चरित्र को जेनेरिक या स्कीम-विशिष्ट सिंटैक्स के भीतर सीमांकक के रूप में भी परिभाषित किया जाना चाहिए और वर्ण की उपस्थिति डेटा के भीतर होनी चाहिए।

सामान्य यूआरआई के लिए वर्तमान मानक RFC 3986 है , जो यह कहना है:

2.2। आरक्षित वर्ण

यूआरआई में "आरक्षित" सेट में वर्णों द्वारा सीमांकित किए गए घटक और उपकेंद्र शामिल होते हैं। इन वर्णों को "आरक्षित" कहा जाता है क्योंकि वे प्रत्येक स्कीम-विशिष्ट सिंटैक्स द्वारा, या यूआरआई के डीरेफेरिंग एल्गोरिथ्म के कार्यान्वयन-विशिष्ट सिंटैक्स द्वारा जेनेरिक सिंटैक्स द्वारा सीमांकक के रूप में परिभाषित किया जा सकता है (या नहीं)। यदि एक यूआरआई घटक के लिए डेटा एक आरक्षित चरित्र के उद्देश्य के साथ एक सीमांकक [जोर जोड़ा] के रूप में संघर्ष करेगा, तो यूआरआई बनने से पहले परस्पर विरोधी डेटा प्रतिशत-एन्कोडेड होना चाहिए।

   आरक्षित = जीन-डेलिम्स / सब-डेलिम्स

   gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

   उप-डेलिम्स = "!" / "$" / "और" / "" "/" ("/") "
               / "*" / "+" / "," / ";" / "="

3.3। पथ घटक

[...]
pchar = अनारक्षित / pct- एन्कोडेड / सब-डेलिम्स / ":" / "@"
[...]

3.4 क्वेरी घटक

[...]
      क्वेरी = * (pchar / "/" / "?")

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

CSV का उपयोग स्ट्रिंग डेटा के लिए ठीक काम करना चाहिए, आपको बस मानक CSV सम्मेलनों का पालन करना होगा और या तो डेटा का उद्धरण करना होगा या बैकस्लैश के साथ अल्पविराम से बचना होगा।

RFC 2396 की तरह, यह HTTP क्वेरी स्ट्रिंग्स में अनकैप्ड कॉमा के लिए भी अनुमति देता है:

2.2। आरक्षित वर्ण

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

चूंकि अल्पविराम का HTTP योजना के तहत कोई आरक्षित उद्देश्य नहीं है, इसलिए उन्हें डेटा में बचना नहीं है। आरक्षित वर्णों के बारे में note 2.3 के नोट से पता चलता है कि शब्दार्थ बदल जाता है जब प्रतिशत-एन्कोडेड केवल आम तौर पर लागू होता है; विशिष्ट योजनाओं के लिए शब्दार्थ बदलने के बिना वर्णों को प्रतिशत-एन्कोडेड किया जा सकता है और अभी भी आरक्षित रखा जा सकता है।


23

यह पूछने के लिए कि क्वेरी स्ट्रिंग में क्या मान्य है, मैंने जाँच की कि अनुरोध करते समय क्रोम द्वारा कौन से विशेष वर्ण मिलते हैं:

Space -> %20
! -> !
" -> %22
# -> removed, marks the end of the query string
% -> %
& -> &
' -> %27
( -> (
) -> )
* -> *
+ -> + (this usually means blank when received at the server, so encode if necessary)
, -> ,
- -> -
. -> .
/ -> /
: -> :
; -> ;
< -> %3C
= -> =
> -> %3E
? -> ?
@ -> @
[ -> [
\ -> \
] -> ]
^ -> ^
_ -> _
` -> `
{ -> {
| -> |
} -> }
~ -> ~

Extended ASCII (like °) -> Every character from this set is encoded

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

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

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


है /programming/2366260/whats-valid-and-whats-not-in-a-uri-query?param=b#1;c#2कोई मान्य क्वेरी पैरामीटर?
सुमित जैन

@SumitJain नहीं, क्योंकि #किसी URI के क्वेरी भाग के रूप में प्रकट नहीं हो सकता है। आपको इसे एनकोड करना होगा %23, ताकि यूआरआई होना चाहिए /programming/2366260/whats-valid-and-whats-not-in-a-uri-query?param=b%231;c%232
दाई

10

महज प्रयोग करें ?q=1+2+3

मैं यहाँ एक चौथा सवाल का जवाब दे रहा हूँ :) जो कि नहीं पूछा लेकिन सभी ने शुरू किया: मैं कैसे संख्याओं की सूची पास करता हूँ एक अल्पविराम से अलग किए गए मान? मुझे लगता है कि सबसे अच्छा तरीका यह है कि उन्हें अंतरिक्ष से अलग कर दिया जाए, जहां रिक्त स्थान को url-form-encoded मिल जाएगा +। महान काम करता है, जब तक आप जानते हैं कि सूची में मूल्यों में कोई रिक्त स्थान नहीं है (कुछ संख्याएं नहीं होती हैं)।


जबकि यह एक टिप्पणी होनी चाहिए (क्योंकि यह सवाल का जवाब नहीं देता है), धन्यवाद। +विशिष्ट मामले में और भी अधिक समझ में आता है कि मैं अल्पविराम का उपयोग करना चाहता था।
गजस

6

page.html क्ष = 1;? q = 2; q = 3

क्या यह एक मान्य URL है?

हाँ। ;आरक्षित है, लेकिन नहीं एक RFC द्वारा। इस घटक को परिभाषित करने वाला संदर्भ application/x-www-form-urlencodedमीडिया प्रकार की परिभाषा है , जो HTML मानक (धारा 17.13.4.1 ) का हिस्सा है । विशेष रूप से डरपोक नोट भाग B.2.2 में छिपा हुआ है :

हम अनुशंसा करते हैं कि HTTP सर्वर कार्यान्वयनकर्ता, और विशेष रूप से, CGI कार्यान्वयनकर्ता ";" के उपयोग का समर्थन करते हैं। लेखकों के बचने की "" और "की जगह" इस तरह से "और" वर्णों की परेशानी।

दुर्भाग्य से ASP.NET सहित कई लोकप्रिय सर्वर-साइड स्क्रिप्टिंग फ्रेमवर्क इस उपयोग का समर्थन नहीं करते हैं।


इसलिए जब ?q=1;q=2;q=3क्वेरी मान्य होती है, तो यह अस्पष्ट होता है: कुछ सर्वर-साइड फ्रेमवर्क इसका अर्थ पढ़ेंगे { q: '1;q=2;q=3' }, अन्य इसे करने के लिए प्रेरित कर सकते हैं { q: {'1', '2', '3'}}
नास बानोव

1
हाँ। और क्या बुरा है, एचटीएमएल 5 अब भाषा के बारे में शामिल नहीं करता है ;, जिसका अर्थ है कि एचटीएमएल 4 और एचटीएमएल 5 असंगत हैं।
ऊग

@NasBanov और फिर भी अन्य (जैसे PHP) इसे व्याख्या करेंगे{ q: 3 }
निकोलस

1
@ नीचोलशैंक - जहां PHP शामिल है, सभी दांव बंद हैं! :)
Nas Banov

1

मैं यह नोट करना चाहूंगा कि page.html?q=1&q=2&q=3यह एक वैध यूआरएल भी है। किसी क्वेरी स्ट्रिंग में किसी सरणी को व्यक्त करने का यह पूरी तरह से वैध तरीका है। आपकी सर्वर तकनीक यह निर्धारित करेगी कि वास्तव में कैसे प्रस्तुत किया गया है।

क्लासिक एएसपी में, आप जांच करते हैं Response.QueryString("q").Countऔर फिर Response.QueryString("q")(0)(और (1) और (2)) का उपयोग करते हैं।

ध्यान दें कि आपने इसे अपने ASP.NET में भी देखा था, (मुझे लगता है कि यह इरादा नहीं था, लेकिन देखो):

Default.aspx?a=1;a=2&b=1&a=3

Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"

ध्यान दें कि अर्धविराम को अनदेखा किया गया है, इसलिए आपने aदो बार परिभाषित किया है, और आपको दो बार इसका मान मिला है, जो अल्पविराम द्वारा अलग किया गया है। सभी एम्परसेंड का उपयोग "1,2,3" के रूप में Default.aspx?a=1&a=2&b=1&a=3होगा a। लेकिन मुझे यकीन है कि प्रत्येक तत्व को प्राप्त करने के लिए एक विधि है, अगर तत्वों में स्वयं अल्पविराम होता है। यह केवल गैर-अनुक्रमित QueryString की डिफ़ॉल्ट संपत्ति है जो अल्पविराम विभाजकों के साथ एक साथ उप-मानों को मिलाता है।


1

मेरी भी यही समस्या थी। जो URL हाइपरलिंक किया गया था, वह एक तृतीय पक्ष URL था page.html?q=1,2,3और केवल स्वरूप में मापदंडों की सूची की अपेक्षा कर रहा था और URL page.html?q=1%2C2%2C3काम नहीं कर रहा था। मैं जावास्क्रिप्ट का उपयोग करके इसे प्राप्त करने में सक्षम था। सबसे अच्छा तरीका नहीं हो सकता है, लेकिन अगर यह किसी की मदद करता है तो यहां समाधान की जांच कर सकता है।


-3

यदि आप ENCODED वर्णों को FLASH / SWF फ़ाइल में भेज रहे हैं , तो आपको चरित्र को दो बार दोहराना चाहिए !! (फ्लैश पार्सर की वजह से)

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