- Chris Morgan memutuskan untuk memblokir sepenuhnya query string yang tidak sah di situsnya, dan implementasinya saat ini ada di Caddyfile
- Ia tidak ingin parameter pelacakan seperti
?ref=example.com ditambahkan ke URL miliknya, dan menurutnya jika perlu cukup melihat header Referer
- Ia berpendapat bahwa UTM parameters seperti
?utm_source=example&utm_*&c.* adalah untuk digunakan oleh pemilik situs, bukan untuk ditempelkan dari luar
- Saat ini situs tersebut sama sekali tidak menggunakan query string, dan jika nanti digunakan, ia berencana hanya mengizinkan parameter yang dikenal
- URL akhirnya diputuskan sebagai
/no-query-strings, dan /%3F tidak dipilih karena ada masalah pada penulisan ulang try_files di Caddy
Memblokir Query String yang Tidak Sah
- Chris Morgan memutuskan untuk memblokir sepenuhnya query string yang tidak sah di situsnya
- Ia tidak ingin parameter pelacakan seperti
?ref=example.com ditambahkan ke URL miliknya, dan menurutnya jika perlu cukup melihat header Referer
- Ia berpendapat bahwa UTM parameters seperti
?utm_source=example&utm_*&c.* adalah untuk digunakan oleh pemilik situs, bukan untuk ditempelkan dari luar
- Saat ini situs ini sama sekali tidak menggunakan query string, dan jika nanti digunakan, ia berencana hanya mengizinkan parameter yang dikenal
- Di masa lalu ia menggunakan URL pembatalan cache seperti
?t=…, ?h=… pada URL stylesheet, tetapi ia menilai tidak masalah jika permintaan seperti itu rusak
- Pemblokiran ini saat ini diimplementasikan di Caddyfile
Proses Memilih URL
-
Rencana untuk menggunakan /?
- Awalnya ia sangat tergoda untuk menerbitkan halaman ini di
https://chrismorgan.info/?
- Bentuknya berupa path kosong dan query kosong, sehingga bisa meruntuhkan banyak asumsi umum yang keliru dan berpotensi menyulitkan beberapa alat
curl tampaknya secara tidak semestinya menghapus tanda tanya di akhir pada baris perintah, dan penggunaan lewat library tidak diuji
- Pada akhirnya ia memutuskan untuk menghormati konsep path dan bersikap lebih ramah kepada orang, terutama karena menurutnya Caddy sudah didorong ke arah yang cukup tidak nyaman
-
Rencana untuk menggunakan /%3F
-
Pilihan akhir
- URL akhirnya diputuskan sebagai
/no-query-strings
/? atau /%3F mungkin nanti digunakan untuk keperluan lain terkait query string
1 komentar
Opini Hacker News
Saya penasaran soal ini, jadi saya melihat lagi standar W3C untuk HTML dan URL, dan ternyata secara mengejutkan tidak ada definisi khusus untuk format query string selain percent-encoding
Query string bisa saja tertukar dengan query string “form-urlencoded”[0], tetapi itu hanyalah salah satu format yang interoperabel. Secara umum, query string adalah sembarang string yang di-percent-encode setelah
?pada URL[1], dan merupakan properti lain dari objekURLHTML yang dapat dipakai untuk menghasilkan responsObjek
URLSearchParamsadalah hasil parsing query string dengan parser form-urlencoded, tetapi itu hanyalah lapisan interoperabilitas untuk JavaScriptJujur, sebelum melihat standarnya saya siap untuk tidak setuju, tetapi standarnya cukup jelas. Merespons dengan 404 untuk query string yang tidak diharapkan juga bisa dianggap tepat. Query string adalah bagian dari API URL sama seperti path, dan kebanyakan orang mungkin setuju bahwa menambahkan string sembarangan ke path bukanlah hal yang baik dan merupakan perilaku yang tidak terdefinisi
[0]: https://url.spec.whatwg.org/#application/x-www-form-urlencod...
[1]: https://url.spec.whatwg.org/#url-class
index.php, lalu semua routing ditangani lewat query stringTentu saja formatnya form-urlencoded, orang-orang juga bukan barbar. Jadi muncul URL seperti
index.php?p=home,index.php?p=shop, atauindex.php?action=showthread&forum=42&thread=17976. Dalam struktur seperti ini, langsung terlihat bahwa 404 memang respons yang tepat untuk parameter query yang tidak dikenalBahkan sekarang pun banyak situs masih bekerja seperti itu, hanya disembunyikan di balik beberapa aturan rewrite Apache/nginx demi SEO
Pada akhirnya URL hanyalah string yang server putuskan bagaimana cara memprosesnya
Hal yang benar-benar lucu dari diskusi ini adalah, sambil khawatir soal efek samping jika merespons 404, orang-orang benar-benar lupa betapa lamanya path tidak punya makna dalam sejarah web. Sekarang path menang. Hampir tidak ada lagi yang memulai baru dengan URL seperti
/item?id=…. Bagus!Ini terbaca sebagai “perbaiki permintaan lalu coba lagi”, dan saya juga memakainya begitu di API yang saya sediakan. Saya lebih memilih ini daripada 406 karena masalahnya bukan sesuatu yang tidak bisa saya proses. Jika seseorang mencoba merusaknya dengan menambahkan sesuatu ke query string, atau membuat request yang tidak sesuai dokumentasi, itu tanggung jawab peminta
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/...
Misalnya dari sudut pandang caching,
url?a=b&c=dbisa dianggap cocok denganurl?c=d&a=bAda banyak sekali kebiasaan yang belum pernah didokumentasikan sebagai standar resmi tetapi akan merusak banyak hal jika tidak diikuti, dan juga banyak “standar” yang membuat orang tampak bodoh jika diikuti secara harfiah
Dalam kasus tulisan aslinya, yang rusak hanyalah orang yang ingin mengunjungi situs itu, dan kemungkinan mereka akan menekan tombol kembali di browser lalu lanjut dengan urusan mereka. Apakah kerugian sebesar itu bisa diterima atau tidak, silakan putuskan sendiri. Hanya saja, bukan berarti sesuatu boleh dilakukan secara definisi hanya karena tidak dilarang standar, dan sebaliknya, bukan berarti jadi tiba-tiba tidak boleh hanya karena dilarang standar
Dari yang saya pahami, penulis tampaknya kesal karena situs lain menambahkan query string seperti
?ref=origin.compada tautan menuju situs penulisSaya tidak paham apa keuntungan untuk situs asal dan apa kerugian untuk situs penulis
Perilaku kedua belah pihak sama-sama terasa sangat membingungkan
Saya paham ketika menjalankan kampanye iklan, Google menambahkan query string UTM untuk melacak dari kampanye mana pengguna datang. Dalam hal itu, asal dan tujuan memang bekerja sama. Tetapi di sini, pihak asal menambahkan sesuatu tanpa alasan yang jelas. Kenapa?
refbahwa banyak traffic datang darixyz.com, lalu berpikir mungkin layak beriklan atau berafiliasi dengan situs ituSejujurnya ini cukup berguna untuk situs niche/startup. Saya pernah mengalami kedua sisi percakapan yang dimulai dari melihat nilai seperti ini di web analytics: satu kali saya yang menghubungi setelah melihat traffic rujukan, dan di lain waktu situs yang saya tautkan yang menghubungi saya. Kedua-duanya berakhir sebagai kemitraan yang saling menguntungkan
Saya juga agak memahami argumen privasinya, tetapi ini tidak memberi informasi lebih banyak daripada header
Refererstandar. Hanya saja, jika memakai alat analitik seperti Simple Analytics/Plausible, hal itu jadi jauh lebih terlihat jelasMenambahkan query string sering dipakai untuk pelacakan. Hanya dari fakta bahwa ada fitur seperti “copy clean link” di Firefox atau Enhanced Tracking Protection yang secara proaktif menghapus sebagian parameter UTM, kita bisa melihat banyak orang tidak menginginkan ini
Beberapa situs dengan sukarela ikut dalam sistem yang secara santai saya sebut “ekonomi pelacakan”. Penerima dapat melihat di log bahwa banyak orang datang dari situs mereka, lalu melakukan tindakan yang menguntungkan situs tersebut
Menolak query string adalah bentuk protes sederhana terhadap sistem itu
Melihat deskripsi “konsol web kecil, terdesentralisasi, self-hosted, yang memungkinkan pengunjung situs web menjelajahi situs dan halaman menarik yang direkomendasikan komunitas operator situs web pribadi independen”, dulu hal seperti ini disebut Webring. Hanya saja tidak se-wah itu
Salah satu masalah yang saya alami saat mengembangkan framework aplikasi open source adalah hosting yang memakai FastCGI tidak menghormati header
Auth, sehingga token terpaksa dikirim lewat query. Saat orang copy-paste alamat web, token itu sering ikut terbawa, dan itu benar-benar buruk. Mungkin sekarang sudah diperbaikiUntuk backend yang saya kendalikan dan tidak perlu dibuka ke semua orang, saya memakai header
Auth?Saya penasaran apakah Anda bisa menjelaskan bagian ini lebih rinci. Secara teknis, kedengarannya seperti record
PARAMtidak benar-benar memberikan nilai yang diharapkanIa mengatakan, “Jadi saya memutuskan untuk mencoba larangan menyeluruh di situs ini: tidak ada query string yang tidak disetujui”, tetapi situsnya tampaknya mengembalikan 414 jika request mengandung query string, dan menurut saya itu pilihan yang salah
Jika protes ini dimaksudkan untuk membela pengguna, kenapa justru menghukum pengguna yang sejak awal mungkin tidak bisa mengendalikan string itu?
Bukankah lebih baik dipakai sebagai sinyal untuk memberi tahu pengguna cara agar mereka bisa membuat keputusan ini sendiri, misalnya lewat alat browser?
400 Bad Request, benar sebagai kode kesalahan klien umum, tetapi tidak lucu
402 Payment Required, sejujurnya saya terbuka jika seseorang mau membayar agar URL tertentu dengan query string berfungsi
404 Not Found, tetapi terlalu mudah menimbulkan efek samping dan tidak menyampaikan nuansa ‘format request Anda salah’ yang saya inginkan
303 See Other tanpa header
Location. Ini sangat jarang sekarang, tetapi sah. Setidaknya begitu menurut RFC 2616 (“The different URI SHOULD be given by the Location field in the response”). Tetapi di 7231 dan 9110 berubah menjadi seolah mengandaikan keberadaan headerLocation(“… as indicated by a URI in the Location header field”). Sementara itu, 301, 302, 307, 308 mengatakan “the server SHOULD generate a Location header field”. Bagaimanapun, menurut saya See Other tanpa headerLocationtetap cukup oke. Tapi URI Too Long lebih lucu”https://chrismorgan.info/no-query-strings?foo
Pada bagian “Anda bisa bilang saya menyalahgunakan 414 URI Too Long. Jawaban saya: cara ini lebih lucu. Pilihan lain yang saya pertimbangkan adalah…”, pilihan lain yang juga bisa dipikirkan adalah 418 I'm a teapot. Toh teko biasanya juga tidak mendukung query string
Ada beberapa pilihan yang kelihatannya cocok tetapi ternyata tidak jika dilihat lebih dekat: 406 “Not Acceptable” berbasis header negosiasi konten, 409 “Conflict” terutama untuk request WebDAV, dan 411, 422, 431 juga untuk kondisi spesifik yang tidak relevan di sini
Error seri 300 maupun 500 juga tidak tepat. Ini bukan relokasi ataupun kegagalan sisi server, melainkan masalah pada request sisi klien
Teko atau terlalu panjang tampaknya kandidat terbaik
Dari nada tulisan ini dan tulisan Chris, rasanya memasukkan parameter query seperti ini seolah berbahaya, tetapi saya tidak paham bahayanya di mana
Saya paham ini bisa merusak beberapa URL, dan itu saja sudah cukup jadi alasan untuk tidak melakukannya. Namun selain itu, ini tampak seperti ketidaknyamanan kecil. Bisa ada yang menjelaskan?
Dari sudut pandang purisme teknis, memodifikasi URL tetap tidak tepat secara teknis meskipun diterima sebagai kebiasaan. URL pada dasarnya harus diperlakukan sebagai nilai opak
Dari sudut pandang sosial, ini adalah pelacakan, dan thread komentar saudara sudah menjelaskannya dengan baik jadi saya tidak akan mengulanginya
Dari sudut pandang kebisingan, ini menutupi bagian yang perlu diperhatikan pengguna dan membuat URL jadi terlalu sulit serta rumit, sehingga ikut membuat orang awam tidak lagi peduli pada URL
Referer, Anda bisa memahami kenapa orang tidak menyukainya: https://en.wikipedia.org/wiki/HTTP_refererAda banyak alasan mengapa seseorang tidak ingin situs yang dituju mengetahui di mana ia berada sebelum sampai ke situs tersebut. Pada dasarnya ini seperti membagikan riwayat penelusuran Anda kepada situs yang sedang dikunjungi
Itulah sebabnya header HTTP
Referertelah mendapat banyak pembaruan, termasuk pembatasan kondisi pengiriman dan fitur untuk mematikannya sepenuhnyaMenambahkan informasi yang sama sebagai parameter URL akan melewati aturan dan opsi penolakan yang sudah ada ini. Gunakan saja standar yang ada
Ini sikap yang kelewat ekstrem, dan tidak benar-benar menjelaskan bagaimana ini akan menghasilkan web yang lebih baik
Yang terakhir mungkin sulit dipahami, tetapi dalam kasus saya, saya sama sekali tidak ingin ada informasi di log yang bisa merugikan pengguna
Secara pribadi saya juga sangat tidak suka ketika ingin menyalin tautan untuk dikirim lewat pesan, tetapi ada kode pelacakan yang dua kali lebih panjang daripada URL aslinya. Saya jadi harus menghapusnya satu per satu, atau membiarkan penerima bertanya-tanya apa sebenarnya deretan karakter acak sepanjang layar itu
Ini melanggar privasi pengguna, pengalaman pengguna juga buruk, dan yang terpenting, tidak ada yang memintanya
Karena sumber asli belum pernah dibahas di HN, saya menaruh tautan itu (https://chrismorgan.info/no-query-strings) di bagian paling atas dan memindahkan tautan ke tulisan tanggapan (https://susam.net/no-query-strings.html) ke penjelasan atas
Keduanya bagus, tetapi terasa lebih adil memberi prioritas pada tulisan asli
Di sekitar saya, sebagian besar situs yang masih memakai GET query sekarang adalah situs penagihan pajak milik pemerintah daerah, yang mengoper variabel ke sana kemari setelah login
Sejujurnya parser routing yang pura-pura jadi URL sungguhan padahal melakukan hal yang sama dengan request GET justru jauh lebih menjengkelkan
Query string itu berguna. Misalnya untuk pencarian file atau jenis file dinamis lain, tetapi tidak seharusnya ditambahkan ke URL yang tidak mengharapkannya
Jadi saya rasa menolak request yang ditambahi hal seperti UTM itu memang benar
Jika query string tidak diharapkan tetapi tetap ada, sebagai respons 404 tampaknya paling masuk akal, dan 400 juga bisa dianggap tepat