Có hợp lệ khi có nhiều hơn một dấu chấm hỏi trong một URL không?


91

Hôm nay tôi đã xem qua URL sau:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

Lưu ý dấu hỏi kép ở đầu chuỗi truy vấn:

??blogid=122&entry_id=64497

Trình duyệt của tôi dường như không gặp bất kỳ sự cố nào với nó và đang chạy một bookmarklet nhanh:

javascript:alert(document.location.search);

chỉ cho tôi chuỗi truy vấn được hiển thị ở trên.

Đây có phải là một URL hợp lệ không? Lý do khiến tôi quá bối rối (giả sử như vậy) là vì tôi cần phân tích cú pháp các URL như thế này cho các tham số truy vấn và việc hỗ trợ dấu hỏi kép sẽ yêu cầu một số thay đổi đối với mã của tôi. Rõ ràng nếu chúng ở trong tự nhiên, tôi cần phải hỗ trợ chúng; Tôi chủ yếu tò mò nếu đó là lỗi của tôi vì đã không tuân thủ chính xác các tiêu chuẩn URL hay thực tế đó là một URL không chuẩn.


May mắn thay, mặc dù vậy, tôi không cần phải thay đổi mã của mình. Tôi đang sử dụng indexOf()để định vị dấu hỏi, vì vậy nó đã chọn vị trí của lần xuất hiện đầu tiên. Sau đó, tôi đang tách các query_parameters ra ở mỗi &và sau đó là các cặp tên / giá trị của chúng ở mỗi =.
Bungle

Câu trả lời:


107

Vâng, nó là hợp lệ. Chỉ cái đầu tiên ? trong URL mới có ý nghĩa, bất kỳ cái nào sau khi nó được coi là dấu chấm hỏi theo nghĩa đen:

Thành phần truy vấn được biểu thị bằng ký tự dấu chấm hỏi đầu tiên ("?") Và được kết thúc bằng ký tự dấu số ("#") hoặc ở cuối URI.

...

Các ký tự gạch chéo ("/") và dấu chấm hỏi ("?") Có thể đại diện cho dữ liệu trong thành phần truy vấn. Lưu ý rằng một số triển khai cũ hơn, có sai sót có thể không xử lý dữ liệu đó một cách chính xác khi nó được sử dụng làm URI cơ sở cho các tham chiếu tương đối (Phần 5.1), rõ ràng là do chúng không phân biệt được dữ liệu truy vấn với dữ liệu đường dẫn khi tìm dấu phân tách thứ bậc. Tuy nhiên, vì các thành phần truy vấn thường được sử dụng để mang thông tin nhận dạng dưới dạng cặp "key = value" và một giá trị thường được sử dụng là tham chiếu đến một URI khác, đôi khi tốt hơn cho khả năng sử dụng là tránh mã hóa phần trăm các ký tự đó.

http://tools.ietf.org/html/rfc3986#section-3.4


9
Vậy điều đó có nghĩa là tham số truy vấn đầu tiên được đặt tên là "? Blogid" chứ không phải "blogid"? Điều đó có thể rất vui ...
GalacticCowboy

3
@GalacticCowboy - Vâng, điều tương tự vừa xảy ra với tôi. Bạn đúng - Firebug xác nhận rằng thực tế là tham số truy vấn đầu tiên ?blogid. Nó thực sự có vẻ là một tham số không thiết yếu, tức là trang được phân phát giống nhau với bất kỳ số lượng dấu hỏi nào ở đó hoặc bỏ qua hoàn toàn tham số.
Bungle

26

Là một câu trả lời có liên quan tiếp tuyến, hãy foo?spam=1?&eggs=3cung cấp cho tham số spamgiá trị1?


Đúng. trong trường hợp không có.htaccess hoặc thủ đoạn tương tự. nếu chúng ta thay đổi foođến script.phpvà thực hiện yêu cầu này script.php?spam=1?&eggs=3sau đó var_dump($_GET)chương trìnharray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe
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.