- Chris Morgan ने अपनी साइट पर अनधिकृत query strings को पूरी तरह ब्लॉक करने का फैसला किया है, और इसका मौजूदा implementation Caddyfile में है
- वह
?ref=example.com जैसे tracking parameters को URL में जोड़े जाने के खिलाफ हैं; उनका मानना है कि ज़रूरत हो तो Referer header देखा जा सकता है
?utm_source=example&utm_*&c.* जैसे UTM parameters उनके अनुसार साइट मालिकों के इस्तेमाल की चीज़ हैं, बाहर से जोड़ने की नहीं
- फिलहाल साइट query strings का बिल्कुल उपयोग नहीं करती, और अगर भविष्य में करेगी तो सिर्फ ज्ञात parameters को ही अनुमति दी जाएगी
- अंतिम URL
/no-query-strings तय किया गया, और /%3F को Caddy के try_files rewrite में समस्या होने के कारण नहीं चुना गया
अनधिकृत query strings को ब्लॉक करना
- Chris Morgan ने अपनी साइट पर अनधिकृत query strings को पूरी तरह ब्लॉक करने का फैसला किया
- वह
?ref=example.com जैसे tracking parameters को अपनी URL में जोड़े जाने के खिलाफ हैं; उनका मानना है कि ज़रूरत हो तो Referer header देखा जा सकता है
?utm_source=example&utm_*&c.* जैसे UTM parameters उनके अनुसार साइट मालिकों के इस्तेमाल की चीज़ हैं, बाहर से जोड़ने की नहीं
- फिलहाल यह साइट query strings का बिल्कुल उपयोग नहीं करती, और अगर भविष्य में करेगी तो सिर्फ ज्ञात parameters को ही अनुमति दी जाएगी
- पहले stylesheet URLs में
?t=…, ?h=… जैसे cache invalidation URLs इस्तेमाल होते थे, लेकिन उनका मानना है कि ऐसे requests टूट भी जाएँ तो ठीक है
- यह ब्लॉक अभी Caddyfile में implement किया गया है
URL चुनने की प्रक्रिया
-
/? इस्तेमाल करने की योजना
- शुरुआत में वह इस पेज को
https://chrismorgan.info/? पर प्रकाशित करने के लिए काफी आकर्षित थे
- खाली path और खाली query का यह रूप आम धारणाओं को तोड़ता और कुछ tools को मुश्किल में डाल सकता था
- ऐसा लगा कि
curl command line पर आखिर का question mark गलत तरीके से हटा देता है, हालांकि library usage की उन्होंने जाँच नहीं की
- आखिरकार उन्होंने path की अवधारणा का सम्मान करने और लोगों के प्रति उदार रहने का फैसला किया, खासकर क्योंकि उनके अनुसार Caddy को पहले ही काफी असहज दिशा में धकेला जा चुका था
-
/%3F इस्तेमाल करने की योजना
-
अंतिम चयन
- अंतिम URL
/no-query-strings तय किया गया
/? या /%3F को बाद में query strings से जुड़ी किसी और उपयोगिता के लिए रखा जा सकता है
1 टिप्पणियां
Hacker News की टिप्पणियाँ
जिज्ञासा में मैंने HTML और URL के W3C standards फिर से देखे, और हैरानी की बात यह थी कि percent-encoding के अलावा query string format की कोई अलग परिभाषा नहीं थी
query string को “form-urlencoded”[0] query string के साथ गड़बड़ किया जा सकता है, लेकिन वह interoperable formats में से सिर्फ एक है। आम तौर पर query string, URL में
?के बाद आने वाली कोई भी percent-encoded string[1] होती है, और यह HTMLURLobject की एक और property है जिसका इस्तेमाल response बनाने में किया जा सकता हैURLSearchParamsobject, form-urlencoded parser से query string parse करने का परिणाम है, लेकिन यह JavaScript के लिए सिर्फ एक interoperability layer हैसच कहूँ तो standards देखने से पहले मैं इसके खिलाफ तर्क देने को तैयार था, लेकिन standards काफ़ी स्पष्ट निकले। अनपेक्षित query strings पर 404 से जवाब देना भी उचित हो सकता है। query string, path जितना ही URL API का हिस्सा है, और path में मनमाना string जोड़ना अच्छा नहीं है और undefined behavior है — यह बात ज़्यादातर लोग मानेंगे
[0]: https://url.spec.whatwg.org/#application/x-www-form-urlencod...
[1]: https://url.spec.whatwg.org/#url-class
index.phpरखना और पूरा routing query string से संभालना काफ़ी आम थाबेशक यह form-urlencoded format होता था, लोग पूरी तरह जंगली नहीं थे। इसलिए
index.php?p=home,index.php?p=shop, याindex.php?action=showthread&forum=42&thread=17976जैसे URL दिखते थे। ऐसे ढाँचे में यह तुरंत साफ़ हो जाता है कि अनजान query parameters पर 404 ही सही response हैसच तो यह है कि आज भी बहुत-सी sites ऐसे ही चलती हैं, बस SEO के लिए Apache/nginx rewrite rules के पीछे छिपा देती हैं
आखिरकार URL बस एक string है, जिसे server अपनी मर्ज़ी से process करता है
इस चर्चा की सबसे मज़ेदार बात यह है कि 404 के side effects की चिंता करते हुए लोग यह पूरी तरह भूल गए कि web के इतिहास में path कितने लंबे समय तक अर्थहीन रहा है। अब path जीत गया है।
/item?id=…जैसे URL से नई शुरुआत अब लगभग नहीं होती। अच्छा है!इसका मतलब निकलता है “request ठीक करो और फिर कोशिश करो”, और मैं अपने API में भी यही इस्तेमाल करता हूँ। 406 की बजाय इसे पसंद करने का कारण यह है कि समस्या मेरी तरफ़ से process न कर पाने की नहीं है। अगर किसी ने query string में कुछ जोड़कर चीज़ तोड़ने की कोशिश की या docs के मुताबिक request नहीं बनाया, तो ज़िम्मेदारी requester की है
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/...
उदाहरण के लिए caching के नज़रिए से
url?a=b&c=dकोurl?c=d&a=bके बराबर माना जा सकता हैबहुत-सी ऐसी conventions हैं जो कभी formal standard के रूप में document नहीं हुईं, लेकिन उन्हें न मानो तो बहुत कुछ टूट जाता है; और बहुत से ऐसे “standards” भी हैं जिन्हें शब्दशः मानो तो मूर्ख लगो
इस मूल लेख के मामले में नुकसान सिर्फ उन लोगों को होगा जो उस site पर जाना चाहते हैं, और शायद वे browser में back दबाकर अपने काम में लग जाएँगे। इतना नुकसान स्वीकार करना है या नहीं, यह वही तय करे। लेकिन सिर्फ इसलिए कि किसी standard ने मना नहीं किया, वह परिभाषा के हिसाब से allowed नहीं हो जाता; और उल्टा, किसी standard ने मना कर दिया तो भी वह अचानक हर हाल में disallowed नहीं हो जाता
मेरी समझ से लेखक इस बात से चिढ़ा हुआ लगता है कि दूसरी websites उसकी site की links में
?ref=origin.comजैसी query string जोड़ रही हैंमुझे समझ नहीं आता कि इससे origin site को क्या फ़ायदा और लेखक की site को क्या नुकसान होता है
दोनों तरफ़ का व्यवहार ही पूरी तरह उलझाऊ लगता है
जब आप ad campaign चलाते हैं, तब Google का UTM query string जोड़कर यह track करना समझ में आता है कि user किस campaign से आया। वहाँ source और destination सहयोग में होते हैं। लेकिन यहाँ source बिना किसी वजह कुछ जोड़ रहा है। क्यों?
refquery string में देखकर किxyz.comसे काफ़ी traffic आ रहा है, सोच सकता है कि उस site पर advertising या partnership की जा सकती हैईमानदारी से कहूँ तो niche/startup sites के लिए यह काफ़ी उपयोगी हो सकता है। web analytics में ऐसी values देखकर शुरू हुई बातचीत के दोनों पक्ष मैंने देखे हैं; एक बार incoming traffic देखकर मैंने खुद संपर्क किया था, और दूसरी बार जिस site को मैंने link किया था वहीं से मुझसे संपर्क हुआ। दोनों बार नतीजा mutually beneficial partnership रहा
privacy वाली बात कुछ हद तक समझता हूँ, लेकिन यह standard
Refererheader से ज़्यादा जानकारी नहीं देता। Simple Analytics/Plausible जैसे analytics tools इस्तेमाल करो तो यह बस कहीं ज़्यादा साफ़ दिखाई देता हैquery string जोड़ना अक्सर tracking के लिए इस्तेमाल होता है। सिर्फ यह देख लेना ही काफ़ी है कि Firefox में “copy clean link” या कुछ UTM parameters को पहले से हटा देने वाली Enhanced Tracking Protection जैसी features मौजूद हैं — इससे साफ़ है कि बहुत-से लोग यह नहीं चाहते
कुछ sites उस व्यवस्था में ख़ुशी-ख़ुशी हिस्सा लेती हैं जिसे मैं हल्के अंदाज़ में “tracking economy” कहता हूँ। ऐसा इसलिए, क्योंकि receiver logs में देखकर कि बहुत लोग किसी खास site से आए हैं, उस site के पक्ष में कुछ कर सकता है
query string को ठुकराना उसी व्यवस्था के खिलाफ़ एक सीधा विरोध है
“एक छोटा, decentralized, self-hosted web console जो website visitors को independent personal website operators की community द्वारा सुझाई गई दिलचस्प websites और pages खोजने देता है” — यह पढ़कर याद आया कि पहले इसे Webring कहते थे। बस इतना चमकीला नहीं था
open source application framework बनाते समय जिन समस्याओं से जूझना पड़ा, उनमें से एक यह थी कि FastCGI इस्तेमाल करने वाली hosting
Authheader को सम्मान नहीं देती थी, इसलिए token को query में भेजना मजबूरी थी। web address copy/paste करते समय token शामिल हो जाना बहुत बुरा अनुभव था। शायद अब तक यह ठीक हो गया होbackend में, जिसे मैं control करता हूँ और जिसे सबके सामने खोलने की ज़रूरत नहीं, मैं header का इस्तेमाल करता हूँ
Authheader बिगाड़ दिया?अगर आप यह हिस्सा थोड़ा विस्तार से समझा सकें तो अच्छा होगा। तकनीकी रूप से यह ऐसा लग रहा है जैसे
PARAMrecord उम्मीद के मुताबिक value दे ही नहीं रहाउसने लिखा, “इसलिए मैंने इस site पर एक blanket ban आज़माने का फैसला किया: unauthorized query strings नहीं,” लेकिन उसकी site लगता है request में query string होने पर 414 लौटाती है, और मेरे हिसाब से यह ग़लत चुनाव है
अगर यह विरोध users की तरफ़दारी के लिए है, तो उस user को क्यों सज़ा दी जाए जिसके पास शायद उस string पर कोई control ही नहीं था?
क्या इसे ऐसे signal की तरह इस्तेमाल नहीं किया जा सकता था जो user को बताता कि browser tools वगैरह से वह खुद यह फ़ैसला ले सकता है?
400 Bad Request, एक सामान्य client error code होने के नाते फिट तो बैठता है, लेकिन मज़ेदार नहीं है
402 Payment Required, सच कहूँ तो अगर कोई पैसे दे कि query string वाले कुछ खास URL काम करें, तो मैं तैयार हूँ
404 Not Found, लेकिन इसमें side effects पैदा होने की संभावना बहुत ज़्यादा है, और यह वह भाव नहीं देता जो मैं चाहता हूँ: ‘request format ग़लत है’
303 See Other बिना
Locationheader के। आजकल यह बहुत दुर्लभ है, लेकिन वैध है। कम-से-कम RFC 2616 में तो था (“The different URI SHOULD be given by the Location field in the response”). लेकिन 7231 और 9110 में भाषा बदलकरLocationheader की मौजूदगी मान ली गई (“… as indicated by a URI in the Location header field”). जबकि 301, 302, 307, 308 कहते हैं “the server SHOULD generate a Location header field”. खैर,Locationheader के बिना See Other भी मुझे काफ़ी ठीक लगता है। लेकिन URI Too Long ज़्यादा मज़ेदार था”https://chrismorgan.info/no-query-strings?foo
“आप कह सकते हैं कि मैं 414 URI Too Long का दुरुपयोग कर रहा हूँ। मेरा जवाब है: यही इसे और मज़ेदार बनाता है। जिन दूसरे विकल्पों पर मैंने सोचा…” — इस हिस्से में एक और विकल्प 418 I'm a teapot भी हो सकता था। आखिर teapot आम तौर पर query strings support नहीं करते
कुछ codes ऊपर-ऊपर से सही लगते हैं, लेकिन गहराई से देखें तो नहीं हैं: 406 “Not Acceptable” content negotiation headers पर आधारित है, 409 “Conflict” ज़्यादातर WebDAV requests के लिए है, और 411, 422, 431 वगैरह भी अलग खास परिस्थितियों के लिए हैं जिनका इससे लेना-देना नहीं
300 या 500 series errors भी अनुपयुक्त हैं। यह न तो redirection है, न server-side failure, बल्कि client-side request problem है
teapot या too long ही सबसे अच्छे उम्मीदवार लगते हैं
इस लेख और Chris के लेख की tone देखकर लगता है कि ऐसे query parameters शामिल करना हानिकारक है, लेकिन मुझे समझ नहीं आता कि यह नुकसान कैसे पहुँचाता है
कुछ URLs टूट सकते हैं, यह बात समझ में आती है, और सिर्फ वही वजह भी इसे न करने के लिए काफ़ी है। फिर भी यह मामूली असुविधा जैसी लगती है। क्या कोई समझा सकता है?
तकनीकी शुद्धतावाद के नज़रिए से, convention के तौर पर स्वीकार होने पर भी URL को modify करना तकनीकी रूप से ग़लत है। URL को मूलतः opaque value की तरह treat करना चाहिए
सामाजिक नज़रिए से यह tracking है, और sibling comment threads इसे अच्छी तरह समझा रही हैं, इसलिए मैं दोहराऊँगा नहीं
noise के नज़रिए से, यह user के लिए महत्वपूर्ण हिस्सों को छिपाता है और URL को इतना मुश्किल और जटिल बनाता है कि आम लोग URL पर ध्यान देना ही छोड़ दें
Refererheader से जुड़ी समस्याएँ पढ़ेंगे तो समझ आएगा कि लोग इसे क्यों नापसंद करते हैं: https://en.wikipedia.org/wiki/HTTP_refererबहुत-सी वजहें हो सकती हैं कि आप नहीं चाहते कि जिस site पर आप जा रहे हैं, उसे यह पता चले कि आप उससे पहले कहाँ थे। मूलतः यह visited site के साथ आपका browsing history साझा करने जैसा है
इसी वजह से HTTP
Refererheader में भेजे जाने की conditions पर रोक, और feature को पूरी तरह बंद कर देने जैसी कई updates आईंवही जानकारी URL parameters में जोड़ना इन मौजूदा नियमों और opt-out सुविधाओं को bypass कर देता है। standard का इस्तेमाल करना चाहिए
यह बेहद अतिवादी रुख़ है, और यह ठीक से समझा नहीं पाता कि इससे web कैसे बेहतर होता है
दूसरी बात समझना कठिन हो सकता है, लेकिन मेरे मामले में मैं कभी नहीं चाहता कि logs में ऐसी जानकारी रहे जो users को नुकसान पहुँचा सके
व्यक्तिगत तौर पर, जब मुझे कोई link copy करके message में भेजना हो और उसमें मूल URL से दोगुना लंबा tracking code चिपका हो, तो मुझे बहुत चिढ़ होती है। फिर या तो मुझे उसे हाथ से साफ़ करना पड़ता है, या सामने वाला screen भर के random characters देखकर सोचता रह जाए कि यह क्या है
यह user privacy का उल्लंघन है, user experience भी ख़राब करता है, और सबसे बढ़कर, किसी ने इसे माँगा ही नहीं
क्योंकि मूल source पर HN में अब तक चर्चा नहीं हुई थी, इसलिए मैंने उस link (https://chrismorgan.info/no-query-strings) को सबसे ऊपर रखा और response post का link (https://susam.net/no-query-strings.html) ऊपर के description में खिसका दिया
दोनों अच्छे हैं, लेकिन मूल लेख को प्राथमिकता देना ज़्यादा fair लगा
मेरे आसपास अब भी GET query इस्तेमाल करने वाली ज़्यादातर sites स्थानीय सरकारों की tax collection sites हैं, जो login के बाद variables को इधर-उधर पास करती हैं
सच कहूँ तो वह routing parser, जो GET request का ही काम करता है लेकिन असली URL होने का नाटक करता है, उससे कहीं ज़्यादा झुंझलाहट होती है
query strings उपयोगी हैं। file search या दूसरी तरह की dynamic files जैसे मामलों में इनका काम है, लेकिन जिस URL को query string की उम्मीद नहीं है, उसमें इन्हें नहीं जोड़ना चाहिए
इसलिए UTM जैसी चीज़ें जुड़ी हुई requests को reject करना सही लगता है
अगर query string अपेक्षित नहीं थी लेकिन मौजूद है, तो response के तौर पर 404 सबसे उचित लगता है, और 400 भी ठीक हो सकता है