2014-04-14 13 views
9

Theo RFC 3986 các ký tự sau được dành riêng và cần phải được mã hoá phần trăm để được sử dụng trong một URI khác hơn là sử dụng dành riêng của họ: :/?#[]@!$&'()*+,;=Khi nào, nếu có, các ký tự như {và} (dấu ngoặc nhọn) có được mã hóa bằng phần trăm trong URL không?

Hơn nữa nó xác định một số nhân vật được đặc biệt ưa thổ lộ: Có vẻ như rõ ràng là người ta nên mã hóa các ký tự dành riêng (để tránh hiểu sai) và không mã hóa các ký tự không được đặt trước (để dễ đọc), nhưng các ký tự không thuộc một trong hai loại sẽ được xử lý như thế nào? Ví dụ: {} không xuất hiện trong một trong hai danh sách, nhưng chúng là các ký tự ASCII chuẩn.

Tìm kiếm các trình duyệt hiện đại để được hướng dẫn, có vẻ như đôi khi chúng có các hành vi khác nhau. Ví dụ, hãy xem xét dán URL https://www.google.com/search?q={ vào thanh địa chỉ của trình duyệt web:

  • Chrome 34.0.1847.116 m không thay đổi nó.
  • Firefox 28.0 không thay đổi.
  • Internet Explorer 9.0 không thay đổi.
  • Safari 5.1.7 thay đổi nó để https://www.google.com/search?q=%7B

Tuy nhiên, nếu một trong bột nhão https://www.google.com/#q={ (loại bỏ "tìm kiếm" và thay đổi ? đến một #, làm cho một phần tính cách của đoạn/băm chứ không phải là chuỗi truy vấn), chúng tôi thấy rằng:

  • Chrome 34.0.1847.116 m thay đổi nó để https://www.google.com/#q=%7B (thông qua JavaScript)
  • Firefox 28.0 không thay đổi nó.
  • Internet Explorer 9.0 không thay đổi.
  • Safari 5.1.7 thay đổi nó để https://www.google.com/#q=%7B (trước khi thực hiện hoạt Javascript)

Hơn nữa, khi sử dụng Javascript để thực hiện các yêu cầu không đồng bộ (tức là sử dụng this MDN example sửa đổi để sử dụng một URL của ?q={), URL không phải là phần trăm được mã hóa tự động. (Tôi đoán điều này là do API XMLHttpRequest giả định rằng URL được mã hóa/đã thoát trước đó.)

Tôi muốn (vì một lý do liên quan đến yêu cầu khách hàng kỳ lạ) sử dụng {} trong phần tên tệp của Các URL không có (1) phá vỡ mọi thứ và lý tưởng cũng không có (2) tạo các mục nhập mã hóa phần trăm trông xấu xí trong bảng điều khiển mạng của các thanh tra/trình gỡ rối web của trình duyệt hiện đại.

Trả lời

3

(RFC 2396)

Bạn nên được mã hóa bất kỳ khôn ngoan phần và RFC đưa ra lý do.


thêm thông tin từ RFC

tài khoản cho <>#% chủ yếu bất kỳ ký tự điều khiển 00-1F7F

cũng đánh dấu là khôn ngoan trong RFC: "{ 01.237.|\^[]`

nếu bạn đang có ý định để cho phép # được trong các giá trị chuỗi truy vấn thì đó là một trường hợp đặc biệt, bởi vì một # là một fragment identifier của một uri.

Một số ký tự mà không cần phải được mã hóa, được chấp nhận hoặc được mã hóa hay không như ~

Có 2 mã hóa được chấp nhận chung cho (không gian) %20+

Here's a fiddle với một số các các trường hợp thử nghiệm tôi đang sử dụng.

+1

Hmm, tôi đã hy vọng cho một câu trả lời từ RFC3986, vì điều đó được cho là sẽ kích hoạt RFC2396, nhưng tôi đánh giá cao phản hồi của bạn. Phụ lục D nói 'Phần 2, về ký tự, đã được viết lại để giải thích ký tự nào được bảo lưu, khi chúng được giữ lại, và tại sao chúng được giữ lại, ngay cả khi chúng không được sử dụng như dấu phân tách bởi cú pháp chung ....' và I đoán trớ trêu thay đó là việc viết lại đã gây ra sự mơ hồ cho tôi. – iX3

Các vấn đề liên quan