Tiếng Việt

Công cụ dành cho nhà phát triển · Bộ mã hóa và giải mã URL

Cấu trúc của URL: sơ đồ, quyền hạn, đường dẫn, truy vấn và đoạn được giải thích

· Lý lịch

url-structure web-standards developer-tools

Năm thành phần URL được gắn nhãn bằng dấu phân cách
Hình minh họa vector ToolAcre gốc

Mọi quyết định mã hóa phần trăm đều phụ thuộc vào phần nào của URL mà ký tự nằm trong đó. Bài đăng này nêu tên năm thành phần từ RFC 3986, cho biết ý nghĩa của từng dấu phân cách và lý do đoạn này không bao giờ đến được máy chủ.

Tại sao cùng một # lại ổn ở một nơi và phá hủy một liên kết ở một nơi khác - một câu hỏi thành phần, không phải một câu hỏi về ký tự

Ký tự băm (#) trong URL có nghĩa hoàn toàn khác nhau tùy thuộc vào vị trí nó xuất hiện. Bên trong giá trị chuỗi truy vấn như ?search=C%23sharp, giá trị này phải được mã hóa thành %23 để đảm bảo an toàn. Ở cuối URL như https://example.com/page#section, nó đánh dấu dấu phân cách phân đoạn và mọi thứ sau đó là một phân đoạn. Một nhân vật, hai bối cảnh, hai ý nghĩa khác nhau. Đây là lý do tại sao các quyết định mã hóa phụ thuộc vào việc biết bạn đang làm việc với phần nào của URL.

Dấu chấm hỏi (?) cũng có tính chất kép. Bên trong một đường dẫn hoặc giá trị truy vấn, nó phải được mã hóa thành %3F để xuất hiện dưới dạng dữ liệu. Là một ký tự chữ giữa đường dẫn và chuỗi truy vấn, nó là cú pháp cấu trúc. Hiểu năm thành phần này—lược đồ, quyền hạn, đường dẫn, truy vấn và phân đoạn—là nền tảng của việc xử lý URL chính xác.

Năm thành phần: lược đồ, thẩm quyền, đường dẫn, truy vấn, phân đoạn — và các dấu phân cách phân tách chúng

RFC 3986 chính thức xác định URL có năm thành phần: lược đồ, quyền hạn, đường dẫn, truy vấn và phân đoạn, được phân tách bằng các dấu phân cách cụ thể. Lược đồ xuất hiện trước tiên, tiếp theo là ://, sau đó là cơ quan, sau đó là /, sau đó là đường dẫn, sau đó là ?, sau đó là truy vấn, sau đó là #, sau đó là đoạn. Không phải tất cả các thành phần đều xuất hiện trong mọi URL. URL tối thiểu có thể chỉ có lược đồ và đường dẫn, như "mailto:user@example.com". URL đầy đủ bao gồm tất cả năm.

Mỗi thành phần có quy tắc cú pháp riêng. Dấu hai chấm được dành riêng trong sơ đồ, dấu gạch chéo trong đường dẫn, dấu và trong truy vấn. Các ký tự dành riêng cần mã hóa khi chúng xuất hiện dưới dạng dữ liệu: dấu gạch chéo trong giá trị đường dẫn trở thành %2F.

Bên trong cơ quan có thẩm quyền - thông tin người dùng, máy chủ và cổng và tại sao @ và : được bảo lưu ở đó

Thành phần thẩm quyền chứa địa chỉ mạng của tài nguyên: tên người dùng, mật khẩu, tên máy chủ và cổng. Định dạng là [userinfo@]host[:port]. Thông tin người dùng và máy chủ được phân tách bằng @; máy chủ và cổng được phân tách bằng :. Các ký tự @ và : này được dành riêng để phân định các thành phần phụ này. Nếu bạn có tên người dùng chứa ký hiệu @, nó phải được mã hóa phần trăm trước khi bạn nối nó. Ví dụ: "user@email.com:password" làm tên người dùng sẽ trở thành "user%40email.com:password" trước @ cuối cùng.

Tên máy chủ có thể là miền đã đăng ký như example.com, địa chỉ IP ở dạng thập phân có dấu chấm như 192.0.2.1 hoặc địa chỉ IPv6 được đặt trong dấu ngoặc như [::1]. Cổng là tùy chọn; nếu bị bỏ qua, lược đồ sẽ xác định giá trị mặc định (80 cho http, 443 cho https, v.v.). Phần thông tin người dùng hiếm khi được sử dụng trong các URL hiện đại nhưng vẫn là một phần của cú pháp.

Các đoạn đường dẫn và ý nghĩa của / — cấu trúc phân cấp và độ phân giải đoạn dấu chấm

Đường dẫn là một chuỗi các đoạn được phân tách bằng dấu gạch chéo về phía trước. Đường dẫn /a/b/c có ba đoạn: a, b và c. Mỗi phân đoạn có thể chứa các ký tự không được đặt trước, các ký tự được mã hóa phần trăm hoặc các ký tự dành riêng nhất định an toàn trong ngữ cảnh này. Dấu gạch chéo trong một phân đoạn phải được mã hóa thành %2F để tránh nhầm lẫn với dấu phân cách. Đường dẫn có thứ bậc; nó ngụ ý rằng a là một vị trí thì a/b cụ thể hơn.

Đường dẫn cũng hỗ trợ các phân đoạn dấu chấm đặc biệt: một dấu chấm (.) có nghĩa là "thư mục hiện tại" và hai dấu chấm (..) có nghĩa là "thư mục mẹ". Một đường dẫn như ../../etc/passwd sẽ đi lên. Các URL hiện đại và HTTP tránh sử dụng các URL này nhưng chúng tồn tại trong cú pháp. Đoạn đường dẫn chứa dấu chấm bằng chữ hoặc dấu chấm kép phải được mã hóa phần trăm nếu ý nghĩa dấu chấm bằng chữ không được dự định.

Truy vấn và phân đoạn - quy ước khóa-giá trị và lý do phân đoạn vẫn ở trong trình duyệt

Chuỗi truy vấn đi theo đường dẫn và bắt đầu bằng ?. Theo truyền thống, nó là một chuỗi các cặp khóa=giá trị được phân tách bằng &, mặc dù cú pháp thực sự không có cấu trúc—bất kỳ thứ gì cũng có thể xuất hiện trong một truy vấn. Nếu bạn có giá trị chứa & hoặc = thì các ký tự đó phải được mã hóa phần trăm để chúng không bị nhầm lẫn với dấu phân cách. Truy vấn được gửi đến máy chủ; máy chủ quyết định phải làm gì với nó.

Đoạn này theo sau truy vấn và bắt đầu bằng #. Mọi thứ sau # là một đoạn và nó không bao giờ đến được máy chủ. Trình duyệt xử lý đoạn cục bộ, thường để chuyển đến một neo được đặt tên hoặc để biểu thị trạng thái trong một ứng dụng một trang. Vì phân đoạn không bao giờ đến được máy chủ nên URL với một phân đoạn khác được coi là trỏ đến cùng một tài nguyên.

Ví dụ đã hoạt động: mổ xẻ một thế giới thực dài URL — dán nhãn cho mọi thành phần và mọi dấu phân cách

Lấy URL "https://user:pass@example.com:8080/path/to/page?search=hello&sort=date#results". Lược đồ là https. Quyền là user:pass@example.com:8080, chia thành thông tin người dùng (user:pass), máy chủ (example.com) và cổng (8080). Đường dẫn là /path/to/page, với các phân đoạn đường dẫn, đến và trang. Truy vấn là search=hello&sort=date, chứa hai tham số. Đoạn này là kết quả. Nhập URL này vào bộ mã hóa & giải mã URL để xem công cụ gắn nhãn và mã hóa từng thành phần như thế nào.

Nếu tìm kiếm chứa &, chẳng hạn như ?search=R&D, nó sẽ trở thành ?search=R%26D khi được mã hóa đúng cách. Các ký tự được mã hóa phần trăm không tạo ranh giới trực quan trong văn bản, vì vậy việc mã hóa và giải mã cẩn thận là điều hết sức cần thiết để phân tích cú pháp chính xác.

Điều này không bao gồm những gì - độ phân giải tham chiếu tương đối và các lược đồ đặc biệt như mailto: và dữ liệu:

Các tham chiếu tương đối như "../page" hoặc "?query=value" đều hợp lệ bên trong HTML và được diễn giải liên quan đến tài liệu hiện tại nhưng chúng có các quy tắc giải quyết riêng. Các lược đồ đặc biệt như mailto:, data: và tệp: tuân theo các quy tắc hoàn toàn khác nhau và không phải là URL tuyệt đối tiêu chuẩn.

Bài đăng này chỉ tập trung vào cấu trúc URL tuyệt đối tiêu chuẩn được trình bày bởi người kiểm tra. Các tham chiếu tương đối cần có cơ sở URL trước khi các thành phần của chúng có thể được diễn giải, trong khi các lược đồ như mailto và dữ liệu không có cùng hình dạng quyền hạn và đường dẫn. Việc tách biệt các trường hợp đó sẽ ngăn không cho quy tắc học được từ địa chỉ HTTPS được áp dụng một cách mù quáng vào cú pháp với các dấu phân cách, bước phân giải hoặc hành vi truyền tải khác nhau.

Bài học rút ra: biết thành phần trước khi bạn mã hóa - cách các chế độ toàn bộ địa chỉ và giá trị đơn của bộ mã hóa URL ánh xạ vào cấu trúc này

Thành phần bạn đang mã hóa xác định ký tự nào cần thoát và ký tự nào an toàn. Dấu gạch chéo là cú pháp bằng chữ trong đường dẫn, vì vậy dấu gạch chéo trong một giá trị phải là %2F. Trong truy vấn, & và = phải được mã hóa nếu chúng xuất hiện trong các giá trị. Bộ mã hóa & giải mã URL có hai chế độ: "thành phần" để mã hóa một giá trị duy nhất và "toàn bộ địa chỉ" cho URL hoàn chỉnh. Sử dụng chế độ thành phần khi xây dựng URL bằng cách nối các phần; sử dụng chế độ toàn bộ địa chỉ để xác minh URL hiện có.

Việc biết năm thành phần và dấu phân cách của chúng cho phép bạn chọn chính xác mỗi khi gặp tác vụ mã hóa.