Mir ist bekannt, dass ein +
in der Abfragezeichenfolge einer URL ein Leerzeichen darstellt. Ist dies auch außerhalb des Abfragezeichenfolgenbereichs der Fall? Das heißt, tut die folgende URL:
http://a.com/a+b/c
tatsächlich darstellen:
http://a.com/a b/c
(und müssen daher codiert werden, wenn es tatsächlich ein sein sollte +
), oder repräsentiert es tatsächlich a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I.
quelle
quelle
rawurldecode
. Ich sage dies hier als Referenz, weil dies ein hoch bewertetes Ergebnis bei der Google-Suche nach "PHP-URL-Dekodierungsunterbrechungen bei Plus-Symbol" ist.Antworten:
+
wird erwartet, dass alle Zeichen in der Pfadkomponente wörtlich behandelt werden.Um es explizit zu sagen:
+
ist nur ein Sonderzeichen in der Abfragekomponente.quelle
+
Zeichen als Leerzeichen in der Abfragekomponente interpretiert wird? Oder ist es einfach eine Regel "aus der Wildnis"?http:
), Autorität (//server.example.com
) und Pfad (/myfile/mypage.htm
) und definiert keine spezielle Bedeutung für das+
Zeichen. Die HTML-Spezifikation definiert die Abfragekomponente als MIME- Typ application / x-www-form-urlencoded, die als "Leerzeichen durch+
und andere Sonderzeichen wie in RFC1738 ersetzen" definiert ist. Es ist also nicht "aus der Wildnis", sondern aus einem akzeptierten (Nicht-RFC-) Standard.Server.UrlEncode
codiert fälschlicherweise Leerzeichen als Plusses im Pfadabschnitt, was gegen HTTP-Regeln verstößt.Auf W3Schools finden Sie eine schöne Liste der entsprechenden URL-codierten Zeichen .
+
wird%2B
%20
quelle
%25252B
Leerzeichen dürfen nur in einem Kontext als "+" codiert werden: application / x-www-form-urlencodierte Schlüssel-Wert-Paare.
Der RFC-1866 (HTML 2.0-Spezifikation), Absatz 8.2.1. In Unterabsatz 1 heißt es: "Die Formularfeldnamen und -werte werden maskiert: Leerzeichen werden durch" + "ersetzt, und dann werden reservierte Zeichen maskiert").
Hier ist ein Beispiel für eine solche Zeichenfolge in einer URL, in der RFC-1866 das Codieren von Leerzeichen als Pluspunkte zulässt: " http://example.com/over/there?name=foo+bar ". Leerzeichen können also erst nach "?" Durch Pluszeichen ersetzt werden (in anderen Fällen sollten Leerzeichen in% 20 codiert werden). Diese Art der Codierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie beispielsweise nach relevanten Absätzen zu application / x-www-form-urlencoded in der HTML 4.01-Spezifikation usw.
Da es jedoch schwierig ist, den Kontext immer korrekt zu bestimmen, empfiehlt es sich, Leerzeichen niemals als "+" zu codieren. Es ist besser, alle Zeichen mit Ausnahme von "nicht reserviert", wie in RFC-3986, S. 2.3 definiert, prozentual zu codieren. Hier ist ein Codebeispiel, das zeigt, was codiert werden soll. Es wird in der Programmiersprache Delphi (Pascal) gegeben, aber es ist sehr leicht zu verstehen, wie es für jeden Programmierer funktioniert, unabhängig von der Sprache, die er besitzt:
quelle
Verwenden Sie die Funktion encodeURIComponent, um die URL zu korrigieren. Sie funktioniert in Browser und node.js.
quelle
Versuchen Sie es unten:
quelle
escape
ist veraltet, stattdessen sollten SieencodeURI
oder im Falle des Abfrageteils verwendenencodeURIComponent
. Auch die Parameterzeichenfolge sollte gemäß w3c codieren .Du sollst immer URLs verschlüsseln.
So codiert Ruby Ihre URL:
quelle