Tại sao tôi quyết định không thêm chuỗi truy vấn (Query Strings) vào URL của bạn

Công nghệ09 tháng 5, 2026·6 phút đọc

Tác giả Susam Pal chia sẻ câu chuyện về việc thêm tính năng theo dõi nguồn truy cập vào dự án Wander Console và lý do ông đã loại bỏ nó sau khi nhận ra những rủi ro về quyền riêng tư và tính ổn định của liên kết. Bài viết là một bài học kinh nghiệm quan trọng về việc tôn trọng cấu trúc URL gốc và các tiêu chuẩn web hiện đại.

Tại sao tôi quyết định không thêm chuỗi truy vấn (Query Strings) vào URL của bạn

Tối qua, một bài viết blog ngắn gọn xuất hiện trong trình đọc RSS của tôi và nó dường như nói chuyện trực tiếp với tôi. Đó là bài viết xuất sắc của Chris Morgan với tựa đề "Tôi đã cấm query strings" (I've banned query strings). Bài viết này đã khiến tôi suy ngẫm lại về một quyết định kỹ thuật trong dự án cá nhân của mình.

Bài học từ cộng đồng Web

Chris là một người mà tôi đã theo dõi các bình luận trên Internet khoảng nửa thập kỷ nay. Tôi tình cờ bắt gặp những nhận xét chi tiết của ông khi ông để lại phản hồi cho bộ quy tắc CSS của tôi trên Hacker News. Mặc dù tôi không phải là một nhà phát triển web chuyên nghiệp — phần lớn sự nghiệp của tôi dành cho lập trình hệ thống bằng C và C++ — nhưng phát triển website và viết các công cụ HTML nhỏ luôn là niềm đam mê lâu năm.

Tôi đã tự học phần lớn kỹ năng web development bằng cách quan sát người khác: từ xem mã nguồn của các website yêu thích vào đầu những năm 2000, đến việc tìm kiếm tài liệu trên MDN Web Docs khi cần thiết. Một vấn đề của việc tự học theo cách này là đôi khi bạn hình thành những thói quen không tối ưu. Vì vậy, những đóng góp của Chris vô cùng quý giá, giúp tôi cải thiện CSS rất nhiều. Một số bài học từ ông vẫn luôn khắc cốt ghi tâm: luôn giữ gạch chân cho các liên kết và giữ màu tím cho các liên kết đã truy cập.

Dự án Wander Console

Cách đây vài tháng, tôi đã tạo ra một dự án mới gọi là Wander Console. Đây là một bảng điều khiển web phi tập trung, tự lưu trữ (self-hosted), cho phép khách truy cập website khám phá các trang web thú vị được giới thiệu bởi một cộng đồng các chủ sở hữu website cá nhân độc lập.

Công cụ này bao gồm một file HTML và một file JavaScript. Bạn chỉ cần sao chép hai file này lên máy chủ web của mình là có thể chạy ngay lập tức mà không cần bất kỳ logic phía máy chủ (server-side logic) nào. Nó hoạt động giống như StumbleUpon đã ngừng hoạt động, nhưng hoàn toàn phi tập trung và linh hoạt hơn các "web rings" truyền thống.

Hiện tại, đã có hơn 50 website sử dụng công cụ này, cùng nhau giới thiệu hơn 1500 trang web.

Một tính năng sai lầm

Lý do tôi nhắc đến dự án này là vì gần đây tôi đã thêm một tính năng gây tranh cãi mà bản thân tôi cũng không hoàn toàn tin tưởng. Trong phiên bản 0.4.0 của Wander Console, tôi đã thêm hỗ trợ cho tham số truy vấn via= khi tải trang web. Ví dụ, nếu bạn truy cập midnight.pub thông qua bảng điều khiển của tôi, công cụ sẽ tải trang bằng URL:

https://midnight.pub/?via=https://susam.net/wander/

Điều này cho phép chủ sở hữu của trang web được giới thiệu biết được nguồn truy cập thông qua nhật ký truy cập (access logs). Tuy nhiên, bài viết gần đây của Chris đã chỉ trích mạnh mẽ các tính năng kiểu này. Ông viết: "Tôi không thích mọi người thêm thứ theo dõi vào URL. Càng không thích hơn khi họ thêm thứ đó vào URL của tôi."

Thực tế, ban đầu tôi rất miễn cưỡng với yêu cầu tính năng này. Nhưng do quá bận rộn với công trình nghiên cứu lý thuyết đồ thị đại số, tôi đã không có nhiều thời gian để suy nghĩ kỹ. Trong một lúc mệt mỏi, tôi đã quyết định triển khai nó theo yêu cầu của cộng đồng, dù trực giác mách bảo rằng điều này không nên làm.

URL bị hỏng

Không lâu sau khi triển khai, trực giác của tôi đã được chứng minh là đúng. Một trong những trang web yêu thích của tôi từ chối tải trong bảng điều khiển. Hãy xem hai URL sau:

https://int10h.org/oldschool-pc-fonts/fontlist/ https://int10h.org/oldschool-pc-fonts/fontlist/?foo

URL đầu tiên tải bình thường, nhưng URL thứ hai trả về lỗi HTTP 404. Khi công cụ của tôi thêm tham số via= vào URL đầu tiên, trang web đã không thể tải được.

Bài học ở đây là: Thay đổi một URL sẽ tạo ra một URL hoàn toàn mới. URL mới đó có thể trỏ đến một tài nguyên khác hoàn toàn, hoặc không trỏ đến tài nguyên nào cả, ngay cả khi sự thay đổi chỉ là thêm một chuỗi truy vấn có vẻ vô hại. Bằng cách thêm chuỗi truy vấn giới thiệu, tôi đã vô tình làm hỏng một URL đang hoạt động tốt từ một website mà tôi rất yêu mến.

Bảng đen với thông điệp không thêm query stringsBảng đen với thông điệp không thêm query strings

Vấn đề Quyền riêng tư và Tiêu chuẩn Web

Cũng đáng để tự hỏi liệu một công cụ HTML có nên quan tâm đến chuỗi truy vấn giới thiệu khi các trình duyệt web đã có cơ chế cho việc này: header HTTP Referer, được điều chỉnh bởi Referrer-Policy.

Chính sách này có thể được đặt ở cấp độ máy chủ, cấp độ tài liệu hoặc thậm chí trên từng liên kết riêng lẻ. Các tiêu chuẩn Web đã cung cấp các điều khiển có chủ đích để quyết định bao nhiêu thông tin giới thiệu nên được gửi. Việc thêm chuỗi truy vấn giới thiệu vào URL đã bỏ qua các điều khiển này. Nó chuyển mối quan tâm về quyền riêng tư và sự ghi nhận từ cơ chế referrer sang nhúng trực tiếp vào URL đích. Tôi không nghĩ một công cụ HTML nên làm điều đó.

Hơn nữa, còn có câu hỏi đạo đức về việc liệu có ổn khi sửa đổi một URL nhất định thay mặt người dùng để chèn chuỗi truy vấn giới thiệu vào đó hay không. Tôi nghĩ là không.

Kết luận

Cuối cùng, tôi quyết định loại bỏ tính năng chuỗi truy vấn giới thiệu khỏi Wander Console. Có thể bạn sẽ thắc mắc tại sao tôi không chỉ cần giữ tính năng đó dưới dạng tùy chọn (opt-in). Câu trả lời là một khi tôi nhận ra tính năng này sai lầm, tôi không muốn nó tồn tại dưới bất kỳ hình thức nào trong phần mềm của mình.

Dự án vẫn còn mới và chúng ta vẫn đang ở những ngày phát hành bản 0.x, vì vậy nếu có thời điểm thích hợp để loại bỏ tính năng, thì chính là bây giờ. Bài viết của Chris đã thúc đẩy tôi đủ mạnh để dành thời gian loại bỏ tính năng được cân nhắc kém này. Tính năng này hiện đã biến mất trong phiên bản 0.6.0.

Đây là một bài học tôi sẽ ghi nhớ cho bất kỳ dự án sở thích nào tôi làm trong tương lai. Nếu tôi từng tải các URL, tôi sẽ tải chúng chính xác như cách tác giả website dự định. Tôi sẽ không thêm chuỗi truy vấn vào URL của bạn.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗