Hướng dẫn mã hóa URL: Percent Encoding
Mã hóa URL, còn được gọi là percent encoding, là một cơ chế chuyển đổi các ký tự không an toàn trong URL thành một định dạng có thể được truyền qua Internet một cách an toàn. Hiểu cách mã hóa URL hoạt động là cần thiết cho phát triển web, API, và bất kỳ công việc nào liên quan đến thao tác URL.
Mã hóa URL là gì?
URL (Uniform Resource Locators) được thiết kế để chứa chỉ một tập hợp con nhỏ các ký tự ASCII. Các ký tự này bao gồm chữ cái (A-Z, a-z), số (0-9), và một số ký tự đặc biệt không dành riêng (-._~). Mọi thứ khác—bao gồm khoảng trắng, ký tự không phải ASCII, và các ký tự dành riêng có ý nghĩa đặc biệt trong URL—phải được mã hóa trước khi được đưa vào URL. Mã hóa URL hoạt động bằng cách thay thế các ký tự không an toàn bằng dấu phần trăm (%) theo sau là hai chữ số thập lục phân đại diện cho mã byte của ký tự. Ví dụ, một khoảng trắng được mã hóa thành %20, và dấu chấm than thành %21. Đây là lý do tại sao nó được gọi là "percent encoding"—dấu % báo hiệu một ký tự được mã hóa. Mã hóa URL phục vụ nhiều mục đích quan trọng. Nó cho phép các ký tự không phải ASCII như ký tự Unicode xuất hiện trong URL. Nó ngăn các ký tự được diễn giải sai—một khoảng trắng trong URL có thể kết thúc URL sớm nếu không được mã hóa. Nó bảo vệ các ký tự dành riêng để chúng có thể được sử dụng theo nghĩa đen—nếu bạn muốn một dấu & trong giá trị tham số truy vấn, nó phải được mã hóa thành %26, nếu không nó sẽ bắt đầu một tham số mới. Các phần khác nhau của URL có các quy tắc mã hóa khác nhau. Tham số truy vấn thường yêu cầu mã hóa nhiều ký tự nhất. Các thành phần đường dẫn có các quy tắc hơi khác nhau. Một số ký tự an toàn trong một phần có thể cần mã hóa trong phần khác. Hiểu các quy tắc này giúp tránh các lỗi tinh vi trong việc xây dựng và phân tích cú pháp URL. Mã hóa URL không phải là mã hóa hoặc bảo mật—nó chỉ đơn giản là chuyển đổi định dạng. Bất kỳ ai cũng có thể giải mã URL được mã hóa ngay lập tức. Mục đích là khả năng tương thích và chức năng đúng đắn, không phải bảo mật. Không bao giờ dựa vào mã hóa URL để ẩn thông tin nhạy cảm trong URL.
Khi nào mã hóa URL
Biết khi nào cần mã hóa các phần của URL là rất quan trọng cho chức năng đúng đắn. Tham số truy vấn gần như luôn cần mã hóa. Nếu bạn đang xây dựng một URL như example.com/search?q=user input, "user input" phải được mã hóa URL. Người dùng có thể nhập bất cứ thứ gì—khoảng trắng, dấu &, dấu =, hoặc các ký tự không phải ASCII. Không mã hóa dẫn đến URL bị hỏng hoặc lỗ hổng bảo mật. Các thành phần đường dẫn chứa các ký tự đặc biệt cũng cần mã hóa. Nếu bạn có một ứng dụng file nơi tên file trở thành một phần của URL, hãy xem xét example.com/files/my document.pdf. Khoảng trắng trong tên file phải được mã hóa thành %20: example.com/files/my%20document.pdf. Tương tự, nếu tên file chứa các ký tự như #, ?, hoặc %, những điều này phải được mã hóa. Đoạn (phần sau #) có các quy tắc riêng của chúng. Đoạn thường được xử lý bởi JavaScript phía client và có thể chứa nhiều loại ký tự, nhưng mã hóa vẫn cần thiết cho các ký tự đặc biệt. Các ứng dụng trang đơn thường sử dụng đoạn cho định tuyến và cần mã hóa các tham số được truyền trong đoạn. Thông tin xác thực trong URL (mặc dù hiếm khi được khuyến nghị) phải được mã hóa nếu chúng chứa các ký tự đặc biệt. Định dạng https://username:[email protected]/ yêu cầu mã hóa bất kỳ ký tự đặc biệt nào trong tên người dùng hoặc mật khẩu. Tuy nhiên, các phương pháp xác thực hiện đại như token trong header hoặc cookie được ưu tiên hơn thông tin đăng nhập trong URL. Đừng mã hóa toàn bộ URL cùng một lúc—điều này sẽ mã hóa các ký tự cần thiết như :// và làm hỏng URL. Chỉ mã hóa các phần cụ thể chứa dữ liệu người dùng hoặc ký tự không an toàn. Các framework hiện đại và thư viện thường cung cấp các hàm để xây dựng URL đúng cách xử lý mã hóa cho bạn. Cẩn thận với mã hóa kép—mã hóa dữ liệu đã được mã hóa. Điều này có thể xảy ra khi nhiều lớp ứng dụng của bạn mỗi lớp cố gắng mã hóa cùng một dữ liệu. Kết quả là các ký tự % được mã hóa thành %25, và dữ liệu trở nên bị hỏng. Luôn rõ ràng về việc lớp nào chịu trách nhiệm về mã hóa.
Các ký tự dành riêng và mã hóa
URL sử dụng một số ký tự cho các mục đích cú pháp đặc biệt. Hiểu các ký tự dành riêng này giúp bạn biết khi nào cần mã hóa chúng. Dấu hai chấm (:) phân tách lược đồ khỏi phần còn lại (https:). Dấu gạch chéo (/) phân tách các thành phần đường dẫn. Dấu chấm hỏi (?) đánh dấu bắt đầu của chuỗi truy vấn. Dấu và (&) phân tách các tham số truy vấn. Dấu bằng (=) phân tách tên tham số khỏi giá trị. Dấu thăng (#) bắt đầu định danh đoạn. Khi các ký tự này xuất hiện trong dữ liệu chứ không phải cú pháp, chúng phải được mã hóa. Một tham số truy vấn có giá trị chứa dấu & phải mã hóa nó thành %26. Nếu không, trình duyệt sẽ diễn giải nó như bắt đầu của một tham số mới. Tương tự, một giá trị chứa = phải mã hóa nó thành %3D. Khoảng trắng là một trường hợp đặc biệt. Mã hóa percent nghiêm ngặt biến khoảng trắng thành %20. Tuy nhiên, trong chuỗi truy vấn, khoảng trắng thường được mã hóa như một dấu cộng (+) thay vì. Cả hai đều hợp lệ trong chuỗi truy vấn, nhưng chỉ %20 hoạt động trong các thành phần đường dẫn. Trình duyệt hiện đại xử lý cả hai, nhưng các framework phía server có thể có sở thích. Các ký tự không phải ASCII yêu cầu mã hóa. Unicode như emoji, ký tự với dấu, và bảng chữ cái không phải Latin phải được mã hóa UTF-8, sau đó percent-encoded. Ví dụ, emoji 😀 trở thành %F0%9F%98%80. Tên miền quốc tế hóa (IDN) sử dụng Punycode thay vì percent encoding, nhưng các đường dẫn và tham số vẫn sử dụng percent encoding. Một số ký tự kỹ thuật không yêu cầu mã hóa nhưng thường được mã hóa cho sự an toàn. Các ký tự không dành riêng (-._~) và các chữ cái số luôn an toàn. Ký tự như !, *, ', (, và ) kỹ thuật được phép nhưng thường được mã hóa trong thực tế. Quyết định mã hóa chúng phụ thuộc vào yêu cầu cụ thể của ứng dụng và máy chủ của bạn. Dấu phần trăm chính nó phải được mã hóa nếu nó xuất hiện theo nghĩa đen trong dữ liệu. Một % theo nghĩa đen được mã hóa thành %25. Điều này ngăn sự mơ hồ giữa các ký tự được mã hóa và dấu % theo nghĩa đen. Không mã hóa % theo nghĩa đen dẫn đến lỗi giải mã khi mã %xy tiếp theo không phải là mã hóa hợp lệ. Các bối cảnh khác nhau có các quy tắc khác nhau. RFC 3986 xác định các quy tắc chính thức. URL trình duyệt tuân theo các đặc tả WHATWG URL. Thư viện API HTTP có thể có hành vi hơi khác nhau. Framework phía server có thể tự động giải mã một số ký tự. Luôn kiểm tra kỹ lưỡng việc xử lý URL trong ngăn xếp cụ thể của bạn.
Thử công cụ
Mã Hóa/Giải Mã URL
Tìm hiểu thêm
Giải thích mã hóa URL
Mã hóa URL đảm bảo các ký tự đặc biệt hoạt động chính xác trong URL. Hướng dẫn này giải thích cách nó hoạt động và tại sao nó quan trọng.
Cấu trúc URL
URL bao gồm nhiều thành phần, mỗi thành phần phục vụ một mục đích cụ thể. Hiểu cấu trúc này giúp làm việc với URL một cách hiệu quả.
Câu hỏi thường gặp
Mã Hóa/Giải Mã URL
Câu hỏi thường gặp →