Czy parametr zapytania adresu URL jest prawidłowy, jeśli nie ma wartości?


138

Czy adres URL jest http://example.com/foo?barprawidłowy?

Szukam linku do czegoś oficjalnego, który mówi w ten czy inny sposób. Prosta odpowiedź tak / nie lub anegdotyczne dowody nie wystarczą.


3
Oprócz URI RFC chciałbym wskazać na przykład z prawdziwego świata. Drupal wykorzystuje te bezwartościowe parametry zapytań w niektórych linkach jako formę pomijania pamięci podręcznej. np. www.google-analytics.com/analytics.js?o490ub lub /themes/seven/ie.css?o4eppb. Prawdopodobnie już to wiesz, ale niektóre natknięcia się na to mogą nie.
Elijah Lynn,

Odpowiedzi:


103
  • Prawidłowe zgodnie z identyfikatorem URI RFC
  • Prawdopodobnie akceptowalne dla struktury / kodu po stronie serwera

URI RFC nie określa format ciągu zapytania. Chociaż uznaje się, że ciąg zapytania często będzie zawierał pary nazwa-wartość, nie jest to wymagane (np. Często będzie zawierał inny identyfikator URI).

3.4. Pytanie

Komponent zapytania zawiera dane niehierarchiczne, które wraz z danymi w komponencie ścieżki (sekcja 3.3) służą do identyfikacji zasobu w ramach schematu URI i uprawnień do nadawania nazw (jeśli istnieją). ...

... Ponieważ jednak komponenty zapytania są często używane do przenoszenia informacji identyfikujących w postaci par „klucz = wartość”, a jedna często używana wartość jest odniesieniem do innego identyfikatora URI, ...

HTML ustala, że ​​formularz przesłany przez HTTP GET powinien zakodować wartości formularza jako pary nazwa-wartość w postaci „? Klucz1 = wartość1 & klucz2 = wartość2 ...” (odpowiednio zakodowane). Parsowanie ciągu zapytania odbywa się zgodnie z kodem po stronie serwera (np. Mechanizm serwletów Java).

Nie identyfikujesz, jakiej struktury po stronie serwera używasz, jeśli w ogóle, ale jest możliwe, że twoja struktura po stronie serwera może założyć, że ciąg zapytania zawsze będzie w parach nazwa-wartość i może się zakrztusić na ciągu zapytania, który nie jest w tym formacie (np ?bar.). Jeśli jest to Twój własny niestandardowy kod analizujący ciąg zapytania, po prostu musisz upewnić się, że obsługujesz ten format ciągu zapytania. Jeśli jest to framework, musisz zapoznać się z dokumentacją lub po prostu przetestować, aby zobaczyć, jak jest obsługiwany.


7
ASP.NET MVC (według mojej wiedzy wersje 4 i 5) zdecydowanie dławią się, gdy nie ma podanej wartości :(
AR

2
isindexMagia namez HTML5 umożliwia wysyłanie ciąg kwerendy bez klucz-wartość w formacie stackoverflow.com/a/37579004/895245
Ciro Santilli郝海东冠状病六四事件法轮功

@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 jako przestarzała funkcja obsługująca starsze wersje HTML3
Evan Carroll

79

Są całkowicie poprawne. Można by je uznać za odpowiednik dużego, umięśnionego faceta stojącego cicho za posłańcem mafii. Facet nie ma imienia i nic nie mówi, ale sama jego obecność przekazuje informacje.


19
Umięśniony facet gangstera ma imię, po prostu go nie znasz. Wiesz, że jest to parametr i zasadniczo niesie wartość logiczną (obecny, nieobecny).
Vlasec,

2
Najlepiej opisać to :)
Mohammad Kermani,

1
Nazywa się Cheich , z odcinka napadu na kasyno w Star Trek: Deep Space 9.
Anthony Rutledge,

8

„Schemat„ http ”służy do lokalizowania zasobów sieciowych za pośrednictwem protokołu HTTP. Ta sekcja definiuje specyficzną dla schematu składnię i semantykę adresów URL http.” http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Więc tak, wszystko jest ważne po znaku zapytania. Twój serwer może interpretować inaczej, ale anegdotycznie , możesz zobaczyć, że niektóre języki traktują to jako wartość logiczną, która jest prawdą, jeśli jest wymieniona.


6
Aby uzyskać formalną definicję, zobacz RFC 2396 ( ietf.org/rfc/rfc2396.txt ), który milczy na temat zawartości ciągu zapytania, poza określeniem dozwolonego zestawu znaków i tych, które mają specjalne znaczenie. W szczególności mówi, że „komponent zapytania jest ciągiem informacji, które mają być zinterpretowane przez zasób”, co oznacza, że ​​jego definicja zależy od protokołu, a zatem klucz = wartość jest w dużej mierze konwencją.
RobertB

6

Tak, to jest ważne.

Jeśli ktoś chce po prostu sprawdzić, czy parametr istnieje, czy nie, jest to jeden ze sposobów.


4

Specyfikacja URI

Jedyną istotną częścią specyfikacji URI jest wiedzieć, że wszystko między pierwszym ?a pierwszym #odpowiada definicji zapytania w specyfikacji. Może zawierać dowolne znaki, takie jak [:/.?]. Oznacza to, że ciąg zapytania, taki jak ?barlub, ?ten+green+applesjest prawidłowy.

Znajdź RFC 3986 tutaj

Specyfikacja HTML

isindex nie jest znacząco HTML5.

Został dostarczony jako przestarzały do użycia jako pierwszy element tylko w formularzu i przesyła bez nazwy.

Jeśli nazwa wpisu to „isindex”, jego typ to „text” i jest to pierwsza pozycja w zestawie danych formularza, a następnie dołącz wartość do wyniku i pomiń pozostałe etapy podrzędne tego wpisu, przechodząc do następnego wpis, jeśli istnieje, lub następny krok w ogólnym algorytmie w przeciwnym razie.

Flaga isindex jest przeznaczona wyłącznie do użytku starszego typu. Formularze w zgodnych dokumentach HTML nie będą generować ładunków, które muszą być zdekodowane z ustawioną tą flagą.

Ostatni raz, kiedy isindex był obsługiwany, był HTML3 . Jest używany w HTML5, aby zapewnić łatwiejszą kompatybilność wsteczną.

Wsparcie w bibliotekach

Obsługa tego formatu URI w bibliotekach jest różna, jednak niektóre biblioteki zapewniają obsługę starszych wersji, aby ułatwić korzystanie z isindex.

Perl URI.pm (wsparcie specjalne)

Niektóre biblioteki, takie jak URI Perla, udostępniają metody analizowania tego rodzaju struktur

$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(brak specjalnej obsługi)

Jako kolejny znacznie częstszy przykład, node.jsprzyjmuje normalną trasę i ułatwia analizę

  • Sznurek
  • lub obiekt kluczy i wartości (za pomocą parseQueryString)

Większość innych interfejsów API analizujących identyfikatory URI postępuje podobnie.



3

isindexprzestarzała magia namez HTML5

Ta przestarzała funkcja umożliwia przesłanie formularza do wygenerowania takiego adresu URL, dostarczając dalszych dowodów, że jest on prawidłowy dla HTML. Na przykład:

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

generuje adres URL typu:

?bar

Standard: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexjest jednak przestarzałe, jak wspomniano na: https://stackoverflow.com/a/41689431/895245


1

Jak wszystkie opisane odpowiedzi, jest to całkowicie poprawne do sprawdzenia, szczególnie w przypadku rzeczy typu boolean

Oto prosta funkcja umożliwiająca pobranie ciągu zapytania według nazwy:

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, " "));
}

a teraz chcesz sprawdzić, czy ciąg zapytania, którego szukasz, istnieje, czy nie, możesz zrobić prostą rzecz, taką jak:

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

exampleQueryStringbędzie false, jeśli funkcja nie może znaleźć ciągu kwerendy, w przeciwnym razie będzie true.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.