- หลังจากอ่าน No query strings ของ Chris Morgan แล้ว Susam Pal ได้ลบพารามิเตอร์ query
via= ที่เคยเพิ่มไว้ใน Wander Console
- Wander Console คือเว็บคอนโซลแบบกระจายศูนย์ โฮสต์เองได้ สำหรับให้ผู้เยี่ยมชมเว็บไซต์ส่วนตัวสุ่มสำรวจหน้าที่ชุมชนแนะนำ ปัจจุบันมีเว็บไซต์โฮสต์แล้วมากกว่า 50 แห่ง และแนะนำเว็บเพจมากกว่า 1500 หน้า
- ฟีเจอร์
via= ทำให้ผู้ดูแลเว็บไซต์ที่ถูกแนะนำเห็นแหล่งที่มาของผู้เข้าชมจาก access log ได้ แต่ใช้วิธีแก้ URL ปลายทางโดยตรง เช่น https://midnight.pub/?via=https://susam.net/wander/
- เมื่อเติม query string เข้าไป จะกลายเป็น URL ใหม่ ซึ่งอาจชี้ไปยัง resource อื่นหรือทำให้เกิด 404 ได้ และเคยทำให้เว็บไซต์จริงพังมาแล้ว เช่นหน้าฟอนต์ของ
int10h.org ที่ใช้ query string เป็นตัวระบุของตัวเอง
- เบราว์เซอร์มี Referer และ Referrer-Policy อยู่แล้วเพื่อควบคุมการส่งข้อมูลแหล่งที่มา ดังนั้นตั้งแต่ Wander Console 0.6.0 เป็นต้นไป จะไม่เพิ่ม query string สำหรับที่มาคำแนะนำลงใน URL ของคนอื่นอีก
บทวิจารณ์ query string ของ Chris Morgan เป็นจุดเริ่มต้น
- Susam Pal อ่านบทความ No query strings ของ Chris Morgan แล้วตัดสินใจลบพารามิเตอร์ query
via= ที่เคยเพิ่มไว้ในโปรเจกต์ Wander Console ของตน
- Chris Morgan ไม่ต้องการให้คนอื่นเติมข้อมูลติดตามลงใน URL ของเขา เช่น
https://chrismorgan.info/no-query-strings?ref=example.com
- ถ้าต้องการข้อมูลแหล่งที่มา ก็สามารถดู HTTP header
Referer ได้ และหากไม่มี header นี้ ก็มักจะมีเหตุผลสมควรอยู่แล้ว
- Susam Pal เคยได้รับบทเรียนเรื่องการคงเส้นใต้ลิงก์และคงสีม่วงของลิงก์ที่เคยเปิดอ่าน จาก feedback แบบละเอียด ที่ Chris Morgan เคยฝากไว้บน Hacker News เกี่ยวกับกฎ CSS boilerplate ของเขา
- นับจากนั้นมาก็ได้ติดตามอ่านบทความและความเห็นด้านเว็บของ Chris Morgan มาโดยตลอด และยกคอมเมนต์ล่าสุดบน Lobsters ใน Adding author context to RSS เป็นอีกตัวอย่างที่มีประโยชน์
โครงสร้างและเป้าหมายของ Wander Console
- Wander Console คือเว็บคอนโซลขนาดเล็ก แบบกระจายศูนย์ และโฮสต์เองได้ ที่ช่วยให้ผู้เยี่ยมชมเว็บไซต์ส่วนตัวสำรวจเว็บไซต์และหน้าที่น่าสนใจซึ่งชุมชนของผู้ดูแลเว็บไซต์ส่วนตัวอิสระแนะนำไว้
- คอนโซลของ Susam Pal อยู่ที่ susam.net/wander/ และเมื่อกดปุ่ม
Wander จะโหลดเว็บเพจส่วนตัวแบบสุ่มที่ชุมชน Wander แนะนำไว้
- เครื่องมือนี้ประกอบด้วยไฟล์ HTML หนึ่งไฟล์ที่ทำหน้าที่เป็นคอนโซล และไฟล์ JavaScript หนึ่งไฟล์ที่ผู้ดูแลเว็บใช้กำหนดรายชื่อคอนโซลเพื่อนบ้านและรายชื่อเว็บเพจที่แนะนำ
- เพียงคัดลอกสองไฟล์นี้ไปไว้บนเว็บเซิร์ฟเวอร์ ก็ใช้งานได้ด้วยเว็บเซิร์ฟเวอร์ทั่วไป โดยไม่ต้องมี logic ฝั่งเซิร์ฟเวอร์หรือซอฟต์แวร์ฝั่งเซิร์ฟเวอร์เพิ่มเติม
- จึงสามารถโฮสต์ได้แม้ในสภาพแวดล้อมที่มีข้อจำกัด เช่น Codeberg Pages หรือ GitHub Pages
- เมื่อกดปุ่ม
Wander คอนโซลจะเชื่อมต่อไปยังคอนโซลระยะไกลอื่น ๆ ดึงคำแนะนำเว็บเพจมา แล้วสุ่มเลือกหนึ่งหน้าเพื่อโหลดในเบราว์เซอร์
- มันคล้าย StumbleUpon ที่เลิกให้บริการไปแล้วอยู่บ้าง แต่ต่างกันตรงที่เป็นระบบกระจายศูนย์เต็มรูปแบบ
- ยังคล้าย webring อยู่เล็กน้อย แต่เครือข่ายชุมชนไม่ได้ถูกจำกัดให้เป็นโครงสร้างแบบวงแหวน และสามารถเป็นกราฟรูปแบบใดก็ได้
- ตอนนี้มีเว็บไซต์มากกว่า 50 แห่งที่โฮสต์เครื่องมือนี้ และเมื่อรวมกันแล้วมีการแนะนำเว็บเพจมากกว่า 1500 หน้า
- ดู snapshot ล่าสุดของคอนโซลที่รู้จักและหน้าที่ถูกแนะนำได้ที่ susam.codeberg.page/wcn/
- หากต้องการดูรายละเอียดเพิ่มเติมของเครื่องมือหรือวิธีตั้งค่าบนเว็บไซต์ของตัวเอง ให้ดูที่ codeberg.org/susam/wander
พารามิเตอร์ query via= ที่เป็นฟีเจอร์ผิดพลาด
- ใน Wander Console 0.4.0 มีการเพิ่มฟีเจอร์ที่แนบพารามิเตอร์ query
via= เวลาจะโหลดเว็บเพจ
- ตัวอย่างเช่น ถ้าเจอ midnight.pub จากคอนโซล susam.net/wander/ เดิมจะโหลดหน้าด้วย URL ต่อไปนี้
https://midnight.pub/?via=https://susam.net/wander/
- วิธีนี้ทำให้ผู้ดูแลเว็บไซต์ที่ถูกแนะนำตรวจสอบจาก access log ได้ว่าการเข้าชมนั้นมาจาก Wander Console
- ฟีเจอร์นี้ถูกเพิ่มเข้ามาหลังเห็น feature request บน Codeberg แต่ในตอนแรกก็ลังเลอยู่
- ตอนนั้นใกล้กำหนดส่งงานวิจัยด้าน algebraic graph theory และส่วนใหญ่ของ Wander Console เองก็ถูกสร้างขึ้นในช่วงพักสั้น ๆ ระหว่างทำวิจัย
- เวอร์ชันแรกของคอนโซลถูกสร้างขึ้นในเช้าตรู่วันหนึ่งภายในเวลาประมาณ 1 ชั่วโมง 30 นาที และฟีเจอร์
via= ก็ถูกทำขึ้นในช่วงพักสั้น ๆ คล้ายกัน
- Susam Pal ชอบแนวทางดูแลโปรเจกต์งานอดิเรกเล็ก ๆ ด้วยการจำกัดขอบเขต และเมื่อทำครบตามความต้องการหลักแล้วก็ถือว่าฟีเจอร์เสร็จสมบูรณ์ แทนที่จะเติมฟีเจอร์ต่อไปเรื่อย ๆ
- ถึงอย่างนั้น เขาก็มองว่าความเหนื่อยล้าและภาระงานวิจัยที่หนัก ทำให้ตนเองไม่อาจมองข้ามคำขอฟีเจอร์นี้ได้
- ฟีเจอร์
via= มีตัวเลือกให้ปิดได้ แต่ภายหลังก็ตัดสินว่านี่ก็เป็นความผิดพลาดเช่นกัน
- ฟีเจอร์ที่น่าสงสัย ต่อให้จะทำ ก็ควรเป็นแบบ เปิดใช้โดยชัดเจน ไม่ใช่เปิดเป็นค่าเริ่มต้นแล้วค่อยปิดได้
- คำพูดจาก Jurassic Park ที่ว่า “มัวแต่สนใจว่าทำได้หรือเปล่า จนไม่ได้คิดว่าควรทำหรือไม่” ดูจะเข้ากับสถานการณ์นี้พอดี
query string ทำให้ URL จริงพังได้
- หลังจากทำฟีเจอร์
via= แล้ว ก็พบว่าหน้าหนึ่งบนเว็บไซต์ที่ชอบไม่สามารถโหลดผ่านคอนโซลได้
- URL ที่เกี่ยวข้อง ซึ่งคล้ายกันแต่ต่างกันเล็กน้อย มีดังนี้
- URL แรกและ URL ที่สองโหลดได้ตามปกติ แต่ URL ที่สามจะคืนหน้า error HTTP 404
- เว็บไซต์นี้ใช้ query string เพื่อตัดสินใจว่าจะแสดงคอลเลกชันฟอนต์ชุดใดจากหลายชุด
- ถ้าเติม query string ตามอำเภอใจเข้าไป เว็บไซต์จะพยายามตีความมันเป็นตัวระบุคอลเลกชันฟอนต์ จึงทำให้โหลดหน้าไม่สำเร็จ
- เมื่อตอนที่ Wander Console เติมพารามิเตอร์ query
via= ให้กับ URL แรก หน้าเว็บก็พังด้วยเหตุผลเดียวกัน
- เมื่อเปลี่ยน URL ต่อให้เป็นเพียงการเพิ่ม query string ที่ดูเล็กน้อย มันก็กลายเป็น URL ใหม่
- URL ใหม่นี้อาจชี้ไปยัง resource ที่ต่างออกไปโดยสิ้นเชิง หรืออาจไม่ชี้ไปยัง resource ใดเลยก็ได้
- Susam Pal จึงมองว่าการเติม query string
via= ทำให้ตนเองไปทำลาย URL ปกติของเว็บไซต์ที่ตน ชื่นชอบ
ปัญหาของการเลี่ยงผ่าน Referer และ Referrer-Policy
- ในเว็บเบราว์เซอร์มี HTTP header Referer สำหรับข้อมูลแหล่งที่มาอยู่แล้ว
- header นี้ถูกควบคุมโดย Referrer-Policy
- Referrer-Policy สามารถตั้งค่าได้ในระดับเซิร์ฟเวอร์ ระดับเอกสาร และระดับลิงก์รายตัว
- มาตรฐานเว็บมีวิธีควบคุมโดยเจตนาอยู่แล้วสำหรับกำหนดว่าจะส่งข้อมูลแหล่งที่มาในขอบเขตใด
- วิธีแนบ query string สำหรับที่มาคำแนะนำลงใน URL เป็นการเลี่ยงผ่านกลไกควบคุมเหล่านี้
- มันเท่ากับดึงประเด็นเรื่องความเป็นส่วนตัวและการระบุแหล่งที่มาออกมาจากกลไก referrer แล้วฝังลงไปตรง ๆ ใน URL ปลายทาง
- จึงเห็นว่าเครื่องมือ HTML ไม่ควรเปลี่ยน URL ด้วยวิธีแบบนี้
- และการแก้ URL แทนผู้ใช้เพื่อใส่ query string บอกที่มาคำแนะนำลงไป ก็ไม่ใช่สิ่งที่ถูกต้องเช่นกัน
การลบฟีเจอร์และหลักการหลังจากนี้
- ฟีเจอร์ query string สำหรับที่มาคำแนะนำถูกลบออกจาก Wander Console แล้ว
- เดิมอาจเก็บไว้เป็นตัวเลือกแบบเปิดใช้โดยชัดเจนได้ แต่เมื่อมองว่าเป็นฟีเจอร์ที่ผิดพลาด ก็ไม่อยากให้มันคงอยู่ในซอฟต์แวร์ไม่ว่าในรูปแบบใด
- เขามองว่านี่เป็นจังหวะที่ดีในการลบ เพราะโปรเจกต์ยังใหม่และยังอยู่ในช่วง release 0.x
- เมื่อ No query strings ของ Chris Morgan ปรากฏขึ้นใน feed reader เขาจึงแบ่งเวลาจากงานวิจัยมาลบฟีเจอร์นี้
- รายละเอียดการลบดูได้จาก commit b26d77c
- ใน release ล่าสุด 0.6.0 ไม่มีฟีเจอร์นี้อีกต่อไป
- ต่อไปหากสร้างโปรเจกต์งานอดิเรกใหม่ที่ต้องโหลด URL เขาได้ตั้งหลักการไว้ว่าจะโหลดตามที่เจ้าของเว็บไซต์ตั้งใจไว้ทุกประการ
- และได้ข้อสรุปว่าจะไม่เพิ่ม query string ลงใน URL ของคนอื่นอีก
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ขอบคุณที่บอกว่าบทความของฉันช่วยอย่างไร เหตุผลที่ฉันเขียนรีวิวละเอียดมีหลายอย่าง ทั้งเพื่อความพึงพอใจของตัวเอง เพื่อช่วยโปรเจ็กต์ต้นฉบับ และบางครั้งก็เพราะนักพัฒนาสนใจ บางครั้งก็ไม่ แต่ก็อาจเป็นเพราะ มีใครบางคนบนอินเทอร์เน็ต คิดผิด อยู่
แต่เหตุผลที่ใหญ่ที่สุดคือฉัน ชอบการสอน และรู้ว่าคนอื่นอ่านรีวิวพวกนี้อยู่ จริง ๆ แล้วรีวิวของฉันมักเป็นคอมเมนต์ที่ได้คะแนนโหวตสูงที่สุดอยู่เสมอ
บางครั้งฉันให้คุณค่ากับคอมเมนต์ขอบคุณจากคนแปลกหน้ามากจริง ๆ และคำขอบคุณละเอียดแบบนี้ก็ทำให้รู้สึกอบอุ่นยิ่งขึ้น
ที่น่าสนใจคือฉันเพิ่งเจอเว็บไซต์ของคุณเมื่อเดือนมกราคม และชอบบทความ “more purple links, please” มากเป็นพิเศษ แต่พอมาวันนี้ถึงได้รู้ว่าโดยไม่รู้ตัวฉันคงมีอิทธิพลต่อจุดยืนของคุณไปแล้ว
เมื่อวานฉันเพิ่งเปิดตัวเว็บไซต์ใหม่ และจากนี้ไปตั้งใจจะลงรีวิวในสื่อต่าง ๆ ให้มากขึ้นอีกมาก เดือนที่แล้วฉันเขียนแผนนี้ไว้เล็กน้อย: https://lobste.rs/s/vpdpkq/llm_reviews_cargo_crev#c_8uk441
อีกอย่างหนึ่งที่ค่อนข้างน่าแปลกใจก็คือ มีอีกตัวอย่างหนึ่งของหน้าที่แสดงอาการแพ้ต่อ query string ที่ถูกเพิ่มเข้ามา อยู่แล้ว เว็บไซต์นั้นใช้ query string สำหรับ route ไปยังหน้าลูกเฉพาะหน้านั้นในรูปแบบ
?1,?2,?3,?4ส่วนหน้าอื่น ๆ กลับรับ query string ได้ การแบ่งหน้าตามลำดับนั้นชัดเจนว่าเป็นโครงสร้างแบบลำดับชั้น จึงขัดกับจิตวิญญาณของ URL แต่รูปแบบอย่าง?page=1ก็พบได้ทั่วไปตอนตัดสินใจว่าจะคืน status code อะไร ฉันกังวลว่า 404 อาจก่อผลข้างเคียงจากสมมติฐานที่ผิดพลาด แต่บางทีฉันอาจกังวลเกินไป ฉันลืมไปว่าเว็บจำนวนมากไม่ได้ใช้ path อย่างมีความหมาย
"418 I'm not a teapot"สำหรับ query string ที่ไม่ได้รับอนุญาตบ้างหรือ?ดีมาก Wander console กำลังเติบโตได้อย่างยอดเยี่ยม และความใส่ใจในรายละเอียดที่ Susam แสดงให้เห็นที่นี่ก็ดูเป็นเหตุผลสำคัญว่าทำไมมันถึงเวิร์ก
ฉันเองก็เคยเห็น URL ของฉันถูกเติม query string ที่ไม่ต้องการอยู่หลายแบบ Newsletter ของ Programmer Weekly ใส่ query มาให้ แต่ก็มี referrer header อยู่แล้ว เลยซ้ำซ้อน
อีกกรณีหนึ่งดูเหมือนจะใส่ unique ID ให้สมาชิกแต่ละคน ซึ่งฉันไม่ต้องการเลย ที่ลำบากคือไม่มี referrer ทำให้ไม่รู้ด้วยซ้ำว่าไซต์ไหนเป็นคนทำ
/blog/modeling-on-demand-pricing/?ck_subscriber_id=<unique-id>ฉันอยากเห็นด้วยกับคำพูดที่ว่า “ถ้าอยากรู้ก็ดู Referer header และถ้าไม่มี ก็น่าจะมีเหตุผล” แต่ Referer นั้นพังไปบางส่วนหรือแทบไร้ประโยชน์มาหลายปีแล้ว นี่แหละคือเหตุผลเดียวที่ทำให้ของพวกนี้เกิดขึ้น
“ทำไมถึงเพิ่มเข้าไปน่ะหรือ? ก็ยอมตามความต้องการของมหาชน” งั้นหรือ มันถึงขั้นนั้นจริงหรือ? มันเป็นแค่ คอมเมนต์สั้น ๆ ที่ได้โหวต 5 คะแนนใน issue ที่ไม่เกี่ยวข้องเองนะ ดูเหมือนการต่อสู้ก่อนยอมจำนนจะไม่ได้ดุเดือดเท่าไร ;-)
ตอนที่โปรเจ็กต์นี้มีผู้ใช้ราวสิบคน ถ้าข้อเสนอฟีเจอร์ใหม่ได้โหวต 5 คะแนน สำหรับฉันมันก็รู้สึกเหมือนเป็น ความต้องการของมหาชน
ปกติโปรเจ็กต์ของฉันเป็นเครื่องมือเล็ก ๆ ที่ทำเป็นงานอดิเรก ยกเว้นไม่กี่ตัว จำนวนผู้ใช้ไม่ได้มากนัก เพราะอย่างนั้นเมื่อได้รับคำขอฟีเจอร์หรือรายงานบั๊ก ไม่ว่าจะอยู่ใน issue ที่เกี่ยวข้องหรือไม่เกี่ยวข้อง มันก็สำคัญสำหรับฉัน ถึงจะยังลงมือทำทันทีไม่ได้เสมอไป แต่ฉันจะจดไว้ในใจว่าคำขอไหนมีความต้องการมากกว่า