2009-01-31 24 views
107

URI (cụ thể là một URL HTTP) có được phép chứa một hoặc nhiều ký tự khoảng trắng không? Nếu một URL phải được mã hóa, thì có phải là + chỉ là một quy ước được theo dõi thường xuyên hoặc một lựa chọn hợp pháp không?URL có được phép chứa không gian không?

Cụ thể, ai đó có thể trỏ đến RFC cho biết rằng URL có dấu cách phải được mã hóa?

Động lực cho câu hỏi: Trong khi thử nghiệm beta một trang web, tôi đã lưu ý rằng một số URL được tạo bằng không gian trong đó. Firefox dường như làm điều đúng, điều làm tôi ngạc nhiên! Nhưng tôi muốn có thể hướng các nhà phát triển đến một RFC để họ cảm thấy cần phải sửa các URL đó.

+0

superset đến sau: tất cả các ký tự không hợp lệ là gì: http://stackoverflow.com/questions/1547899/which-characters-make-a-url-invalid –

+0

** Liên quan: ** [Trong URL, không gian nên được mã hóa bằng% 20 hoặc +?] (http://stackoverflow.com/q/1211229/1497596) – DavidRR

Trả lời

87

Theo RFC 1738:

không an toàn:

Nhân vật có thể không an toàn đối với một số lý do. Không gian ký tự không an toàn vì không gian quan trọng có thể biến mất và không gian không đáng kể có thể được giới thiệu khi URL được phiên âm hoặc sắp xếp hoặc tuân theo các chương trình xử lý văn bản. Các ký tự "<"">" không an toàn vì chúng được sử dụng làm dấu phân tách xung quanh URL bằng văn bản miễn phí; dấu trích dẫn (""") được sử dụng để phân tách các URL trong một số hệ thống.Ký tự "#" không an toàn và nên luôn được mã hóa vì nó được sử dụng trong World Wide Web và trong các hệ thống khác để phân định URL từ định danh phân đoạn/neo có thể theo dõi. Ký tự "%" không an toàn vì nó được sử dụng cho mã hóa các ký tự khác. Các ký tự khác không an toàn vì cổng và các đại lý vận tải khác đôi khi được sửa đổi các ký tự như vậy. Những nhân vật "{", "}", "|", "\", "^", "~", "[", "]", và "`".

Tất cả các ký tự không an toàn phải luôn được mã hóa trong URL. Đối với ví dụ , ký tự "#" phải được mã hóa trong các URL ngay cả trong các hệ thống thường không xử lý phân đoạn hoặc neo mã định danh, sao cho URL được sao chép vào hệ thống khác không sử dụng chúng, sẽ không cần thiết thay đổi mã hóa URL.

+1

1738 đã bị vượt quá 2396. http://www.ietf.org/rfc/rfc2396.txt Đó là thông số kỹ thuật Uri hiện tại. Nó không quan trọng trong trường hợp này mặc dù. –

+33

Và 2396 đã bị thay thế bởi 3986. Nhiều người hiểu sai, vì RFC không thay đổi, và do đó không nói với người đọc rằng họ đã lỗi thời. Gợi ý: sử dụng http://tools.ietf.org/html/rfcnnnn, chẳng hạn như http://tools.ietf.org/html/rfc2396 thay vào đó, nó hiển thị siêu dữ liệu bị thiếu ở trên cùng. –

5

Có, không gian thường được mã hóa thành "% 20". Bất kỳ thông số nào chuyển đến URL phải được mã hóa, chỉ vì lý do an toàn.

-3

Bạn chưa từng thấy điều đó. Có lẽ bạn có thể định cấu hình máy chủ web để chấp nhận điều đó ...

3

Url nên không có dấu cách trong đó. Nếu bạn cần giải quyết vấn đề, hãy sử dụng giá trị được mã hóa của %20

2

Firefox 3 sẽ hiển thị %20 trong URL dưới dạng dấu cách trong thanh địa chỉ.

4

Để trả lời câu hỏi của bạn. Tôi sẽ nói rằng nó khá phổ biến cho các ứng dụng để thay thế không gian trong các giá trị sẽ được sử dụng trong các URL. Lý do cho việc này là theo cách thông thường để tránh việc mã hóa phần trăm (URI) khó đọc hơn xảy ra.

Khám phá bài viết wikipedia này về Percent-encoding.

9

URL được xác định trong RFC 3986, mặc dù các RFC khác cũng có liên quan nhưng RFC 1738 đã lỗi thời.

Chúng có thể không có khoảng trống trong chúng, cùng với nhiều ký tự khác. Vì những ký tự bị cấm này thường cần được biểu diễn bằng cách nào đó, có một lược đồ mã hóa chúng thành một URL bằng cách dịch chúng thành tương đương hệ thập lục phân ASCII của chúng với tiền tố "%".

Hầu hết các ngôn ngữ lập trình/nền tảng cung cấp các chức năng mã hóa và giải mã URL, mặc dù chúng có thể không tuân thủ đúng các tiêu chuẩn RFC. Ví dụ, tôi biết rằng PHP không.

26

Câu trả lời ngắn gọn: không, bạn phải mã hóa khoảng trắng; nó chính xác để mã hóa một không gian dưới dạng +, nhưng chỉ trong chuỗi truy vấn; trong đường dẫn, bạn phải sử dụng %20.

+1

Xin chào, tôi cũng bối rối, đôi khi tôi thấy cuốn sách sử dụng "+" nhưng đôi khi "% 20", bạn có thể hiển thị một số ví dụ cho điều này không? Khi người dùng gửi biểu mẫu, biểu mẫu mã hóa không gian như thế nào? với nhân vật nào? – GMsoF

+1

Xem [câu trả lời này] (http://stackoverflow.com/a/1211256/1497596) để biết thêm chi tiết. – DavidRR

+0

Còn mảnh/phần băm thì sao? Làm thế nào không gian nên được mã hóa ở đó? – gumkins

40

Tại sao mã phải được mã hóa? Yêu cầu có dạng như sau:

GET /url HTTP/1.1 
(Ignoring headers) 

Có 3 trường được phân cách bằng khoảng trắng. Nếu bạn đặt một khoảng trống trong url của mình:

GET /url end_url HTTP/1.1 

Bạn biết có 4 trường, máy chủ HTTP sẽ cho bạn biết đó là yêu cầu không hợp lệ.

GET /url%20end_url HTTP/1.1 

3 lĩnh vực => hợp lệ

Lưu ý: trong chuỗi truy vấn (? Sau), một không gian thường được mã hóa như một +

GET /url?var=foo+bar HTTP/1.1 

hơn

GET /url?var=foo%20bar HTTP/1.1 
+0

Nếu var thực sự là "foo + bar" chứ không phải "foo bar" thì sao? – Ivo3185

+8

A + phải được mã hóa dưới dạng% 2b – Julien

+2

Tôi cho rằng đó là yêu cầu của lớp vận chuyển, không phải của đặc tả URI. GET rõ ràng là thuộc tính của thông số http:, không phải là đặc tả URL. Tương tự, bạn có thể tranh luận về các url trong "url" phải được mã hóa vì các trang web khác sẽ bị hỏng. Nhưng đó là một thuộc tính của các hạn chế định dạng HTML, (có những chiến lược khác chống lại), không phải là một đặc tính của đặc tả URL. –

5

Ai đó có thể trỏ đến RFC cho biết rằng URL có dấu cách phải là vi được mã hóa?

URI, và do đó URL, được định nghĩa trong RFC 3986.

Nếu bạn nhìn vào ngữ pháp định nghĩa đằng kia bạn cuối cùng sẽ lưu ý rằng một nhân vật không gian không bao giờ có thể trở thành một phần của một URL cú pháp quy phạm pháp luật, do đó cụm từ "URL có khoảng trắng" là một mâu thuẫn trong chính nó.

4

URL có thể có ký tự khoảng trắng và chúng sẽ được hiển thị dưới dạng% 20 trong hầu hết các trình duyệt, nhưng quy tắc mã hóa trình duyệt thay đổi khá thường xuyên và chúng tôi không thể phụ thuộc vào cách trình duyệt hiển thị URL.

Vì vậy, thay vào đó bạn có thể thay thế Ký tự khoảng trắng trong URL bằng bất kỳ ký tự nào bạn nghĩ sẽ làm cho URL dễ đọc hơn và 'Khá';) .....Các ký tự tổng quát như vậy được ưu tiên là "-", "_", "+" .... nhưng đây không phải là sự ép buộc để bạn có thể sử dụng bất kỳ ký tự nào không được cho là trong URL Đã có.

Vui lòng tránh%, &,}, {,], [, /,>, < làm thay thế ký tự không gian URL vì chúng có thể gây ra lỗi trên các trình duyệt và nền tảng nhất định.

Như bạn có thể thấy chính Stak overflow sử dụng ký tự '-' làm thay thế Space (% 20).

Có câu hỏi thú vị.

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