URL có được phép chứa khoảng trắng không?


132

Là một URI (cụ thể là URL HTTP) được phép chứa một hoặc nhiều ký tự khoảng trắng? Nếu một URL phải được mã hóa, đó +chỉ là một quy ước thường được tuân theo, hoặc một sự thay thế hợp pháp?

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

Độ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 với khoảng trắng trong đó. Firefox dường như làm điều đúng đắn, điều đó làm tôi ngạc nhiên! Nhưng tôi muốn có thể chỉ cho các nhà phát triển một RFC để họ cảm thấy cần phải sửa các URL đó.


superset xuất hiện sau: tất cả các ký tự không hợp lệ là gì: stackoverflow.com/questions/1547899/
mẹo

Câu trả lời:


101

Theo RFC 1738 :

Không an toàn:

Nhân vật có thể không an toàn vì một số lý do. Ký tự khoảng trắng không an toàn vì các khoảng trắng đáng kể có thể biến mất và các khoảng trắng không đáng kể có thể được đưa vào khi URL được sao chép hoặc sắp chữ hoặc chịu sự điều trị của 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 cách xung quanh các URL trong văn bản miễn phí; dấu ngoặc kép ( """) được sử dụng để phân định URL trong một số hệ thống. Ký tự "#"này không an toàn và phải luôn được mã hóa bởi vì nó được sử dụng trong World Wide Web và trong các hệ thống khác để phân định URL từ một mã định danh phân đoạn / neo có thể đi theo nó. Nhân vật"%"là không an toàn vì nó được sử dụng để mã hóa các ký tự khác. Các ký tự khác không an toàn vì các cổng và các tác nhân vận chuyển khác đôi khi được biết là sửa đổi các ký tự đó. 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 một URL . 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ý các mã định danh phân mảnh hoặc neo, do đó, nếu URL được sao chép vào một hệ thống khác sử dụng chúng, sẽ không cần thiết phải thay đổi mã hóa URL.


2
1738 đã được vượt quá 2396. ietf.org/rfc/rfc2394.txt Đó là thông số kỹ thuật hiện tại của Uri. Nó không quan trọng trong trường hợp này mặc dù.
Steve Severance

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

43

Tại sao nó phải được mã hóa? Một yêu cầu trông như thế này:

GET /url HTTP/1.1
(Ignoring headers)

Có 3 trường cách nhau một khoảng trắng. Nếu bạn đặt một khoảng trắng trong url của bạn:

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à một yêu cầu không hợp lệ.

GET /url%20end_url HTTP/1.1

3 trường => hợp lệ

Lưu ý: trong chuỗi truy vấn (sau?), Một khoảng trắng thường được mã hóa thành dấu +

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

thay vì

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

Điều gì xảy ra nếu var thực sự là "foo + bar" chứ không phải "foo bar"?
Ivo3185

2
Tôi cho rằng đó là một 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à một thuộc tính của đặc tả http: không phải đặc tả URL. Tương tự như vậy, bạn có thể lập luận các trích dẫn trong url "phải" được mã hóa vì nếu không các trang web sẽ bị hỏng. Nhưng đó là một thuộc tính của các giới hạn định dạng HTML, (có các chiến lược khác chống lại), không phải là một thuộc tính của đặc tả URL.
Kent Fredric

ietf.org/rfc/rfc1738.txt - Các ký tự không an toàn bao gồm cả không gian) nên được mã hóa
Julien

@KentFredric Đây có thể là lớp trình bày , không phải lớp vận chuyển . Như Julien (gần như) viết, thông số URI gốc ( RFC 1630 ) có hạn chế này, do đó, đây là một phần của đặc tả URI bất kể cảm xúc cá nhân của bạn. Vì thông số URI được viết sau các bản nháp HTTP, rất có thể các URI được thiết kế với HTTP, bao gồm cả việc cấm sử dụng khoảng trắng, nhưng nó không thực sự quan trọng, phải không? Sự thật là thông số kỹ thuật là gì.
Christopher Schultz

38

Câu trả lời ngắn hơn: không, bạn phải mã hóa một khoảng trắng; nó đúng để mã hóa một không gian như +, 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ể đưa ra một số ví dụ cho việc 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 để biết thêm chi tiết.
DavidRR

Điều gì về phần / băm? Làm thế nào không gian nên được mã hóa ở đó?
kẹo cao su

@gumkins: đoạn (# và sau) không được gửi đến máy chủ. Trong thực tế, bạn có thể sử dụng% 20 hoặc + bất cứ nơi nào để mã hóa một khoảng trắng.
Julien

9

Các URL được định nghĩa 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.

Họ có thể không có không gian trong đó, cùng với nhiều nhân vật khác. Do các ký tự bị cấm đó thường cần được thể hiện bằng cách nào đó, nên có một sơ đồ mã hóa chúng thành một URL bằng cách dịch chúng sang tương đương 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ữ / nền tảng lập trình 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.


7

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


6

URL có thể có Ký tự không gian trong đó 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 sẽ hiển thị URL.

Vì vậy, thay vào đó, bạn có thể thay thế Ký tự không gian 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á';) ..... O các ký tự chung được ưa thích là "-", "_", "+" .... nhưng đây không phải là sự ép buộc nên bạn có thể sử dụng bất kỳ ký tự nào không được cho là có trong URL.

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 một số trình duyệt và Nền tảng nhất định.

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

Có một câu hỏi hạnh phúc.


5

Các Url không nên có khoảng trắng trong chúng. 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 nó là%20


5

Ai đó có thể trỏ đến RFC chỉ ra rằng một URL có khoảng trắng phải được mã hóa không?

Các URI và do đó URL được xác định trong RFC 3986.

Nếu bạn nhìn vào ngữ pháp được xác định ở đó, cuối cùng bạn sẽ lưu ý rằng một ký tự khoảng trắng không bao giờ có thể là một phần của URL hợp pháp về mặt cú pháp, do đó, thuật ngữ "URL có khoảng trắng" tự nó là một mâu thuẫn.


3

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

Kiểm tra bài viết trên wikipedia này về Mã hóa phần trăm .


2

Firefox 3 sẽ hiển thị %20s trong các URL dưới dạng khoảng trắng trên thanh địa chỉ.


Đây không phải là một câu trả lời thích hợp cho câu hỏi khá đơn giản : "Is a URL allowed to contain a space?". Thay vì một bình luận.
Roko C. Buljan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.