🌐 VI

🔗 URL Encoder/Decoder

Mã hóa hoặc giải mã URL an toàn. Xử lý ký tự đặc biệt, ký tự quốc tế và khoảng trắng trong tham số truy vấn để tạo URL hợp lệ.

HƯỚNG DẪN

Tìm hiểu thêm

01

1. Mã hóa URL là gì?

Mã hóa URL (mã hóa phần trăm) là quá trình chuyển các ký tự không an toàn trong URL thành % theo sau là mã hệ thập lục phân. Vì URL chỉ cho phép ký tự ASCII, nên ký tự tiếng Hàn, ký tự đặc biệt và khoảng trắng cần được mã hóa. Ví dụ: dấu cách thành %20, @ thành %40, và ký tự é được mã hóa thành %C3%A9. Theo tiêu chuẩn RFC 3986, các ký tự ngoài A-Z, a-z, 0-9, -, _, ., ~ phải được mã hóa. Các phần khác nhau của URL (tham số truy vấn, đường dẫn, hash) có quy tắc mã hóa khác nhau.

02

2. Vì sao phải mã hóa ký tự đặc biệt

Ký tự đặc biệt trong URL mang ý nghĩa riêng, nên phải được mã hóa khi dùng làm giá trị. Ví dụ: & là dấu phân tách tham số, nên để đưa & vào giá trị, hãy mã hóa thành %26. = là dấu phân tách khóa-giá trị, ? bắt đầu phần truy vấn, # bắt đầu fragment. Dấu cách được mã hóa thành + hoặc %20. Nếu không mã hóa tiếng Hàn hoặc ký tự đặc biệt, máy chủ có thể phân tích sai hoặc trả về lỗi 404. Luôn mã hóa khi đưa từ khóa tìm kiếm hoặc dữ liệu người dùng vào URL.

03

3. Mã hóa tham số truy vấn

Tham số truy vấn là phần của URL thường được mã hóa nhất. Ví dụ: https://example.com/search?q=search&category=IT. Cả "search" và "IT" đều nên được mã hóa. Dùng encodeURIComponent() của JavaScript sẽ mã hóa =, &, ?, giúp an toàn cho giá trị tham số truy vấn. encodeURI() dùng để mã hóa toàn bộ URL nhưng không mã hóa =, &, ?, nên không phù hợp cho giá trị truy vấn. Luôn mã hóa riêng từng khóa và giá trị bằng encodeURIComponent().

04

4. encodeURI so với encodeURIComponent

JavaScript có hai hàm mã hóa URL. encodeURI() mã hóa toàn bộ URL và không mã hóa các ký tự cấu trúc như :, /, ?, &, =. Dùng cho URL hoàn chỉnh. encodeURIComponent() mã hóa các thành phần URL (giá trị tham số, v.v.) và mã hóa tất cả ký tự cấu trúc. Dùng cho từng thành phần riêng như tham số truy vấn và đoạn đường dẫn. Trong hầu hết trường hợp, dùng encodeURIComponent() sẽ an toàn hơn. Giải mã tương ứng bằng decodeURI() và decodeURIComponent().

05

5. Tên miền quốc tế hóa (IDN)

Tên miền bằng tiếng Hàn hoặc ngôn ngữ khác (ví dụ: hanguk.com) được chuyển sang Punycode. Punycode biểu diễn tên miền Unicode bằng ASCII với tiền tố xn--. Ví dụ: "hanguk.com" trở thành "xn--3e0b707e.com". Trình duyệt tự động thực hiện chuyển đổi này, nhưng khi xử lý trực tiếp trong code, cần dùng thư viện Punycode. Lưu ý rằng đường dẫn và truy vấn URL dùng mã hóa phần trăm thông thường, còn tên miền dùng Punycode.

06

6. Thực hành tốt nhất khi mã hóa URL

Những điểm quan trọng khi mã hóa URL: Luôn mã hóa đầu vào của người dùng để ngăn tấn công XSS. Cẩn thận không mã hóa lặp lại các URL đã được mã hóa. Khi dựng URL, hãy mã hóa từng phần riêng rồi ghép lại. Các HTTP client như fetch() và axios thường tự động mã hóa, nên tránh lặp. Máy chủ thường hỗ trợ tự động giải mã, vì vậy thường không cần giải mã rõ ràng. Khi ghi log hoặc gỡ lỗi URL, dạng đã giải mã sẽ dễ đọc hơn.

Câu hỏi thường gặp

Tôi nên chọn mã hóa thành phần hay mã hóa toàn bộ URL?
Dùng "mã hóa thành phần" khi chỉ mã hóa một phần của URL, như giá trị tham số truy vấn. Chỉ dùng "mã hóa toàn bộ URL" khi xử lý cả một URL hoàn chỉnh.
Vì sao URL không phải tiếng Anh cần được mã hóa?
URL chỉ cho phép ký tự ASCII, nên các ký tự không phải ASCII (như é, tiếng Hàn hoặc tiếng Trung) phải được chuyển sang mã hóa phần trăm (ví dụ: %C3%A9) để máy chủ phân tích chính xác.
Điều gì xảy ra nếu tôi mã hóa một URL đã được mã hóa?
Bạn sẽ bị mã hóa kép, trong đó % được mã hóa lại thành %25, làm hỏng giá trị gốc. Hãy kiểm tra xem chuỗi đã được mã hóa chưa trước khi mã hóa lại.
Tôi nên làm gì nếu giải mã báo lỗi "Invalid URL encoding"?
Kiểm tra các chuỗi phần trăm chưa hoàn chỉnh trong dữ liệu đầu vào (ví dụ: %2 nhưng không đủ chữ số hex phía sau). Chỉ những chuỗi được mã hóa đúng mới có thể giải mã.
Khoảng trắng được mã hóa như thế nào?
Khoảng trắng thường được mã hóa thành + trong chuỗi truy vấn hoặc %20 trong đường dẫn. Công cụ này dùng định dạng mã hóa phần trăm chuẩn %20.