Là một tham số truy vấn url hợp lệ nếu nó không có giá trị?


138

Là một url như http://example.com/foo?barhợp lệ?

Tôi đang tìm kiếm một liên kết đến một cái gì đó chính thức nói cách này hay cách khác. Một câu trả lời có / không đơn giản hoặc bằng chứng giai thoại sẽ không cắt được.


3
Ngoài URI RFC, tôi muốn chỉ ra một ví dụ thực tế về điều này. Drupal sử dụng các tham số truy vấn vô giá trị này trong một số liên kết như một hình thức phá vỡ bộ đệm. ví dụ: www.google-analytics.com/analytics.js?o490ub hoặc /theme/seven/ie.css?o4eppb. Bạn có thể đã biết điều này nhưng một số vấp ngã về điều này có thể không.
Elijah Lynn

Câu trả lời:


103
  • Hợp lệ với URI RFC
  • Có thể chấp nhận đối với khung / mã phía máy chủ của bạn

Các URI RFC không uỷ quyền cho một định dạng chuỗi truy vấn. Mặc dù người ta nhận ra rằng chuỗi truy vấn sẽ thường mang các cặp tên-giá trị, nhưng nó không bắt buộc (ví dụ: nó thường sẽ chứa một URI khác).

3.4. Truy vấn

Thành phần truy vấn chứa dữ liệu không phân cấp, cùng với dữ liệu trong thành phần đường dẫn (Mục 3.3), phục vụ để xác định tài nguyên trong phạm vi của lược đồ và quyền đặt tên của URI (nếu 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ạng cặp "key = value" và một giá trị được sử dụng thường xuyên là tham chiếu đến một URI khác, ...

HTML thiết lập rằng một biểu mẫu được gửi qua HTTP GET sẽ mã hóa các giá trị của biểu mẫu dưới dạng các cặp tên-giá trị ở dạng "? Key1 = value1 & key2 = value2 ..." (được mã hóa chính xác). Phân tích chuỗi truy vấn tùy thuộc vào mã phía máy chủ (ví dụ: công cụ Java servlet).

Bạn không xác định khung công tác phía máy chủ nào bạn sử dụng, nếu có, nhưng có thể khung công tác phía máy chủ của bạn có thể cho rằng chuỗi truy vấn sẽ luôn ở trong các cặp giá trị tên và nó có thể bị sặc trên một chuỗi truy vấn không phải là trong định dạng đó (ví dụ ?bar). Nếu mã tùy chỉnh của riêng bạn phân tích chuỗi truy vấn, bạn chỉ cần đảm bảo bạn xử lý định dạng chuỗi truy vấn đó. Nếu là khung, bạn sẽ cần tham khảo tài liệu của mình hoặc chỉ cần kiểm tra nó để xem cách xử lý.


7
ASP.NET MVC (phiên bản 4 và 5 theo hiểu biết của tôi) chắc chắn bị nghẹt thở khi không có giá trị được cung cấp :(
AR

2
Các isindexkỳ diệu nametừ HTML5 cho phép gửi một chuỗi truy vấn mà không cần định dạng giá trị khóa stackoverflow.com/a/37579004/895245
Ciro Santilli郝海东冠状病六四事件法轮功


79

Chúng hoàn toàn hợp lệ. Bạn có thể coi họ là tương đương với anh chàng to lớn vạm vỡ đứng lặng lẽ đằng sau sứ giả mob. Anh chàng không có tên và không nói, nhưng sự hiện diện đơn thuần của anh ta truyền tải thông tin.


19
Anh chàng vạm vỡ của mobster có một cái tên, bạn không biết điều đó. Bạn biết nó trên param mặc dù và về cơ bản nó mang một giá trị boolean (hiện tại, vắng mặt).
Vlasec

2
Cách tốt nhất để mô tả nó :)
Mohammad Kermani

1
Tên của ông lớn là Cheich , từ tập phim vụ cướp sòng bạc đó trong Star Trek: Deep Space 9.
Anthony Rutledge

8

"Lược đồ" http "được sử dụng để định vị tài nguyên mạng thông qua giao thức HTTP. Phần này xác định cú pháp và ngữ nghĩa dành riêng cho lược đồ cho các URL http." http://www.w3.org/Prot Protocol / rfc2616 / rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Vì vậy, có, bất cứ điều gì là hợp lệ sau một dấu hỏi. Máy chủ của bạn có thể diễn giải khác nhau, nhưng theo giai thoại , bạn có thể thấy một số ngôn ngữ coi đó là giá trị boolean, điều này đúng nếu được liệt kê.


6
Để biết định nghĩa chính thức, hãy xem RFC 2396 ( ietf.org/rfc/rfc2394.txt ), im lặng về nội dung của chuỗi truy vấn, ngoài việc chỉ định bộ ký tự hợp pháp và các ký tự có ý nghĩa đặc biệt. Cụ thể, nó nói rằng "thành phần truy vấn là một chuỗi thông tin được giải thích bởi tài nguyên", ngụ ý rằng định nghĩa của nó phụ thuộc vào giao thức, và do đó, key = value chủ yếu theo quy ước.
RobertB

6

Vâng, nó là hợp lệ.

Nếu chỉ đơn giản là muốn kiểm tra xem tham số có tồn tại hay không, đây là một cách để làm như vậy.


4

Thông số URI

Phần có liên quan duy nhất của thông số URI là để biết mọi thứ giữa đầu tiên ?và đầu tiên #phù hợp với định nghĩa của truy vấn. Nó có thể bao gồm bất kỳ nhân vật như [:/.?]. Điều này có nghĩa là một chuỗi truy vấn như ?bar, hoặc ?ten+green+appleshợp lệ.

Tìm RFC 3986 tại đây

Thông số HTML

isindex không có nghĩa là HTML5.

Nó được cung cấp không dùng nữa để chỉ sử dụng làm thành phần đầu tiên trong một biểu mẫu và gửi mà không có tên.

Nếu tên của mục nhập là "isindex", loại của nó là "văn bản" và đây là mục nhập đầu tiên trong tập dữ liệu biểu mẫu, sau đó nối giá trị vào kết quả và bỏ qua phần còn lại của mục phụ cho mục này, chuyển sang mục tiếp theo mục, nếu có, hoặc bước tiếp theo trong thuật toán tổng thể khác.

Cờ isindex chỉ dành cho sử dụng cũ. Các biểu mẫu trong việc tuân thủ các tài liệu HTML sẽ không tạo ra các tải trọng cần được giải mã với bộ cờ này.

Lần cuối isindex được hỗ trợ là HTML3 . Việc sử dụng trong HTML5 là để cung cấp khả năng tương thích ngược dễ dàng hơn.

Hỗ trợ trong thư viện

Hỗ trợ trong các thư viện cho định dạng URI này khác nhau tuy nhiên một số thư viện cung cấp hỗ trợ cũ để dễ sử dụng isindex.

Perl URI.pm (hỗ trợ đặc biệt)

Một số thư viện như URI của Perl cung cấp các phương pháp phân tích cú pháp các loại cấu trúc này

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(không hỗ trợ đặc biệt)

Như một ví dụ khác thường xuyên hơn, node.jsđi theo lộ trình bình thường và giảm bớt phân tích cú pháp

  • Một chuỗi
  • hoặc, một đối tượng của các khóa và giá trị (sử dụng parseQueryString)

Hầu hết các API phân tích cú pháp URI khác theo sau một cái gì đó tương tự như thế này.



3

isindexma thuật không dùng nữa nametừ HTML5

Tính năng không dùng nữa này cho phép gửi biểu mẫu để tạo một URL như vậy, cung cấp thêm bằng chứng rằng nó hợp lệ đối với HTML. Ví dụ:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

tạo một URL loại:

?bar

Tiêu chuẩn: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribution

isindextuy nhiên không được chấp nhận như đã đề cập tại: https://stackoverflow.com/a/41689431/895245


1

Như tất cả các câu trả lời khác được mô tả, nó hoàn toàn hợp lệ để kiểm tra, đặc biệt đối với các công cụ loại boolean

Đây là một hàm đơn giản để lấy chuỗi truy vấn theo tên:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

và bây giờ bạn muốn kiểm tra xem chuỗi truy vấn bạn đang tìm kiếm có tồn tại hay không, bạn có thể thực hiện một việc đơn giản như:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

những exampleQueryStringsẽ là falsenếu chức năng không thể tìm thấy chuỗi truy vấn, nếu không sẽ true.

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.