Ist ein URL-Abfrageparameter gültig, wenn er keinen Wert hat?


138

Ist eine URL wie http://example.com/foo?bargültig?

Ich suche nach einem Link zu etwas Offiziellem, das so oder so sagt. Eine einfache Ja / Nein-Antwort oder anekdotische Beweise werden es nicht ändern.


3
Neben dem URI-RFC möchte ich ein Beispiel aus der Praxis nennen. Drupal verwendet diese wertlosen Abfrageparameter in einigen Links als eine Form des Cache-Bustings. zB www.google-analytics.com/analytics.js?o490ub oder /themes/seven/ie.css?o4eppb. Sie wissen das wahrscheinlich schon, aber einige, die darüber stolpern, wissen es vielleicht nicht.
Elijah Lynn

Antworten:


103
  • Gültig für den URI-RFC
  • Wahrscheinlich akzeptabel für Ihr serverseitiges Framework / Code

Der URI-RFC schreibt kein Format für die Abfragezeichenfolge vor. Obwohl erkannt wird, dass die Abfragezeichenfolge häufig Name-Wert-Paare enthält, ist dies nicht erforderlich (z. B. enthält sie häufig einen anderen URI).

3.4. Abfrage

Die Abfragekomponente enthält nicht hierarchische Daten, die zusammen mit den Daten in der Pfadkomponente (Abschnitt 3.3) dazu dienen, eine Ressource im Rahmen des URI-Schemas und der Benennungsberechtigung (falls vorhanden) zu identifizieren. ...

... Da Abfragekomponenten jedoch häufig verwendet werden, um identifizierende Informationen in Form von "Schlüssel = Wert" -Paaren zu übertragen, und ein häufig verwendeter Wert eine Referenz auf einen anderen URI ist, ...

HTML legt fest, dass ein über HTTP GET übermitteltes Formular die Formularwerte als Name-Wert-Paare im Formular "? Key1 = value1 & key2 = value2 ..." (ordnungsgemäß codiert) codieren soll. Das Parsen der Abfragezeichenfolge hängt vom serverseitigen Code ab (z. B. Java-Servlet-Engine).

Sie identifizieren nicht, welches serverseitige Framework Sie gegebenenfalls verwenden, aber es ist möglich, dass Ihr serverseitiges Framework davon ausgeht, dass die Abfragezeichenfolge immer in Name-Wert-Paaren vorliegt und eine Abfragezeichenfolge erstickt, die dies nicht ist in diesem Format (zB ?bar). Wenn es sich um Ihren eigenen benutzerdefinierten Code handelt, der die Abfragezeichenfolge analysiert, müssen Sie lediglich sicherstellen, dass Sie dieses Abfragezeichenfolgenformat verarbeiten. Wenn es sich um ein Framework handelt, müssen Sie Ihre Dokumentation konsultieren oder einfach testen, um zu sehen, wie damit umgegangen wird.


7
ASP.NET MVC (Versionen 4 und 5 meines Wissens) erstickt definitiv, wenn kein Wert angegeben wird :(
AR

2
Die isindexMagie namevon HTML5 ermöglicht das Senden einer Abfragezeichenfolge
Ciro Santilli 1 冠状 病. 事件 1

@CiroSantilli 事件 事件 2016 六四 事件 法轮功 als veraltete Funktion für Legacy-Unterstützung von HTML3
Evan Carroll

79

Sie sind vollkommen gültig. Sie könnten sie als das Äquivalent des großen muskulösen Mannes betrachten, der still hinter dem Mob-Boten steht. Der Typ hat keinen Namen und spricht nicht, aber seine bloße Anwesenheit vermittelt Informationen.


19
Der muskulöse Typ des Gangsters hat einen Namen, man weiß es einfach nicht. Sie kennen es jedoch auf dem Parameter und es enthält im Grunde einen booleschen Wert (vorhanden, nicht vorhanden).
Vlasec

2
Der beste Weg, um es zu beschreiben :)
Mohammad Kermani

1
Der große Typ heißt Cheich aus dieser Casino-Überfall-Episode auf Star Trek: Deep Space 9.
Anthony Rutledge

8

"Das" http "-Schema wird verwendet, um Netzwerkressourcen über das HTTP-Protokoll zu lokalisieren. In diesem Abschnitt werden die schemaspezifische Syntax und Semantik für http-URLs definiert." http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Also ja, nach einem Fragezeichen ist alles gültig. Ihr Server interpretiert möglicherweise anders, aber anekdotisch können Sie sehen, dass einige Sprachen dies als einen booleschen Wert behandeln, der wahr ist, wenn er aufgelistet ist.


6
Informationen zur formalen Definition finden Sie in RFC 2396 ( ietf.org/rfc/rfc2396.txt ), in dem der Inhalt der Abfragezeichenfolge nicht angegeben wird, außer um den zulässigen Zeichensatz anzugeben, und solche, die eine besondere Bedeutung haben. Insbesondere heißt es, dass die "Abfragekomponente eine Zeichenfolge von Informationen ist, die von der Ressource interpretiert werden sollen", was bedeutet, dass ihre Definition vom Protokoll abhängt und daher der Schlüssel = Wert weitgehend konventionell ist.
RobertB

6

Ja, es ist gültig.

Wenn man einfach nur überprüfen möchte, ob der Parameter vorhanden ist oder nicht, ist dies eine Möglichkeit, dies zu tun.


4

URI Spec

Der einzig relevante Teil der URI-Spezifikation besteht darin, alles zwischen dem ersten ?und dem ersten zu wissen, was# der Definition einer Abfrage durch die Spezifikation entspricht. Es kann beliebige Zeichen wie enthalten [:/.?]. Dies bedeutet, dass eine Abfragezeichenfolge wie ?baroder ?ten+green+applesgültig ist.

Den RFC 3986 finden Sie hier

HTML Spec

isindex ist nicht sinnvoll HTML5.

Es wird nur zur Verwendung als erstes Element in einem Formular als veraltet bereitgestellt und ohne Namen übermittelt.

Wenn der Name des Eintrags "isindex" lautet, sein Typ "text" ist und dies der erste Eintrag im Formulardatensatz ist, hängen Sie den Wert an das Ergebnis an und überspringen Sie den Rest der Unterschritte für diesen Eintrag und fahren Sie mit dem nächsten fort ggf. Eintrag oder sonst der nächste Schritt im Gesamtalgorithmus.

Das isindex-Flag ist nur für ältere Zwecke bestimmt. Formulare in konformen HTML-Dokumenten generieren keine Nutzdaten, die mit diesem Flag dekodiert werden müssen.

Das letzte Mal, dass isindex unterstützt wurde, war HTML3 . Die Verwendung in HTML5 dient dazu, die Abwärtskompatibilität zu vereinfachen.

Unterstützung in Bibliotheken

Die Unterstützung in Bibliotheken für dieses URI-Format ist unterschiedlich. Einige Bibliotheken bieten jedoch Legacy-Unterstützung, um die Verwendung zu vereinfachen isindex.

Perl URI.pm (besondere Unterstützung)

Einige Bibliotheken wie Perls URI bieten Methoden zum Parsen dieser Art von Strukturen

$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(keine besondere Unterstützung)

Als weiteres weitaus häufigeres Beispiel wird node.jsder normale Weg gewählt und das Parsen erleichtert

  • Ein Faden
  • oder ein Objekt mit Schlüsseln und Werten (using parseQueryString)

Die meisten anderen URI-Parsing-APIs folgen einer ähnlichen Vorgehensweise.



3

isindexveraltete Magie nameaus HTML5

Diese veraltete Funktion ermöglicht es einer Formularübermittlung, eine solche URL zu generieren, was einen weiteren Beweis dafür liefert, dass sie für HTML gültig ist. Z.B:

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

generiert eine URL vom Typ:

?bar

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

isindexwird jedoch wie unter: https://stackoverflow.com/a/41689431/895245 erwähnt veraltet


1

Wie alle anderen Antworten beschrieben, ist es perfekt für die Überprüfung gültig, insbesondere für boolesche Dinge

Hier ist eine einfache Funktion, um die Abfragezeichenfolge nach Namen abzurufen:

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

Wenn Sie nun überprüfen möchten, ob die gesuchte Abfragezeichenfolge vorhanden ist oder nicht, können Sie Folgendes tun:

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

das exampleQueryStringwird , falsewenn die Funktion nicht den Query - String finden kann, wird anders sein true.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.