Darf eine URL ein Leerzeichen enthalten?

132

Darf eine URI (insbesondere eine HTTP-URL) ein oder mehrere Leerzeichen enthalten? Wenn eine URL verschlüsselt werden muss , ist dies +nur eine häufig befolgte Konvention oder eine legitime Alternative?

Kann jemand auf einen RFC verweisen, der angibt, dass eine URL mit einem Leerzeichen codiert werden muss ?

Motivation für die Frage: Beim Betatest einer Website habe ich festgestellt, dass einige URLs mit Leerzeichen erstellt wurden. Firefox schien das Richtige zu tun, was mich überraschte! Aber ich wollte in der Lage sein, die Entwickler auf einen RFC zu verweisen, damit sie das Bedürfnis verspüren, diese URLs zu reparieren.

Joe Casadonte
quelle
Obermenge, die später kam: Was sind alle ungültigen Zeichen: stackoverflow.com/questions/1547899/…
Ciro Santilli 法轮功 冠状 病 六四 事件 29

Antworten:

101

Gemäß RFC 1738 :

Unsicher:

Zeichen können aus mehreren Gründen unsicher sein. Das Leerzeichen ist unsicher, da möglicherweise signifikante Leerzeichen verschwinden und unbedeutende Leerzeichen eingefügt werden können, wenn URLs transkribiert oder gesetzt oder der Behandlung von Textverarbeitungsprogrammen unterzogen werden. Die Zeichen "<"und ">"sind unsicher, da sie als Trennzeichen für URLs im Freitext verwendet werden. Das Anführungszeichen ( """) wird in einigen Systemen verwendet, um URLs abzugrenzen. Das Zeichen "#"ist unsicher und sollte immer codiert werden, da es im World Wide Web und in anderen Systemen verwendet wird, um eine URL von einer Fragment- / Ankerkennung abzugrenzen, die möglicherweise darauf folgt. Der Charakter"%"ist unsicher, da es für die Codierung anderer Zeichen verwendet wird. Andere Zeichen sind unsicher, da bekannt ist, dass Gateways und andere Transportmittel solche Zeichen manchmal ändern. Diese Zeichen sind "{", "}", "|", "\", "^", "~", "[", "]", und "`".

Alle unsicheren Zeichen müssen immer in einer URL verschlüsselt sein . Beispielsweise muss das Zeichen "#"in URLs auch in Systemen codiert werden, die normalerweise keine Fragment- oder Ankerkennungen verarbeiten. Wenn die URL in ein anderes System kopiert wird, das sie verwendet, muss die URL-Codierung nicht geändert werden.

Marc Novakowski
quelle
2
1738 wurde von 2396 abgelöst. Ietf.org/rfc/rfc2396.txt Dies ist die aktuelle Uri-Spezifikation. In diesem Fall spielt es jedoch keine Rolle.
Steve Severance
40
Und 2396 wurde von 3986 abgelöst. Viele Leute verstehen das falsch, da RFCs unveränderlich sind und dem Leser daher nicht sagen, dass sie veraltet sind. Hinweis: Verwenden Sie tools.ietf.org/html/rfcnnnn , z. B. tools.ietf.org/html/rfc2396. Stattdessen werden die fehlenden Metadaten oben angezeigt .
Julian Reschke
43

Warum muss es verschlüsselt werden? Eine Anfrage sieht folgendermaßen aus:

GET /url HTTP/1.1
(Ignoring headers)

Es gibt 3 Felder, die durch ein Leerzeichen getrennt sind. Wenn Sie ein Leerzeichen in Ihre URL einfügen:

GET /url end_url HTTP/1.1

Sie wissen, dass 4 Felder vorhanden sind. Der HTTP-Server teilt Ihnen mit, dass es sich um eine ungültige Anforderung handelt.

GET /url%20end_url HTTP/1.1

3 Felder => gültig

Hinweis: In der Abfragezeichenfolge (nach?) Wird ein Leerzeichen normalerweise als + codiert

GET /url?var=foo+bar HTTP/1.1 

eher, als

GET /url?var=foo%20bar HTTP/1.1 
Julien
quelle
Was wäre, wenn var wirklich "foo + bar" und nicht "foo bar" wäre?
Ivo3185
2
Ich würde argumentieren, dass dies eine Anforderung der Transportschicht ist, nicht der URI-Spezifikation selbst. GET ist eindeutig eine Eigenschaft der http: -Spezifikation, nicht der URL-Spezifikation. Ebenso könnte man argumentieren, dass Anführungszeichen in URLs "müssen" codiert werden, da sonst Webseiten beschädigt würden. Dies ist jedoch eine Eigenschaft von HTML-Formatierungsbeschränkungen (gegen die es andere Strategien gibt) und keine Eigenschaft der URL-Spezifikation.
Kent Fredric
ietf.org/rfc/rfc1738.txt - Unsichere Zeichen einschließlich Leerzeichen) sollten codiert werden
Julien
@KentFredric Dies ist eher die Präsentationsschicht , nicht die Transportschicht . Wie Julien (fast) schreibt, enthält die ursprüngliche URI-Spezifikation ( RFC 1630 ) diese Einschränkung, sodass sie unabhängig von Ihren persönlichen Gefühlen Teil der URI-Spezifikation selbst ist. Da die URI-Spezifikation nach den HTTP-Entwürfen geschrieben wurde, ist es sehr wahrscheinlich, dass URIs unter Berücksichtigung von HTTP entworfen wurden, einschließlich des Verbots der Verwendung von Leerzeichen, aber es spielt keine Rolle, oder? Die Wahrheit ist, dass die Spezifikation das ist, was die Spezifikation ist.
Christopher Schultz
38

Kürzere Antwort: Nein, Sie müssen ein Leerzeichen codieren. Es ist richtig, ein Leerzeichen als zu codieren +, jedoch nur in der Abfragezeichenfolge. in dem Pfad müssen Sie verwenden %20.

Peter Hilton
quelle
1
Hallo, ich bin auch verwirrt, manchmal habe ich gesehen, dass das Buch "+" verwendet, aber manchmal "% 20". Können Sie ein Beispiel dafür zeigen? Wie codiert das Formular den Speicherplatz, wenn der Benutzer das Formular sendet? mit welchem ​​Charakter?
GMsoF
1
Weitere Einzelheiten finden Sie in dieser Antwort .
DavidRR
Was ist mit Fragment / Hash-Teil? Wie sollen dort Räume codiert werden?
Gummis
@gumkins: Das Fragment (# und danach) wird nicht an den Server gesendet. In der Praxis können Sie% 20 oder + überall verwenden, um ein Leerzeichen zu codieren.
Julien
9

URLs werden in RFC 3986 definiert , obwohl auch andere RFCs relevant sind, RFC 1738 jedoch veraltet ist.

Sie dürfen zusammen mit vielen anderen Zeichen keine Leerzeichen enthalten. Da diese verbotenen Zeichen häufig irgendwie dargestellt werden müssen, gibt es ein Schema zum Codieren in eine URL, indem sie in ihr hexadezimales ASCII-Äquivalent mit dem Präfix "%" übersetzt werden.

Die meisten Programmiersprachen / -plattformen bieten Funktionen zum Codieren und Decodieren von URLs, obwohl sie möglicherweise nicht den RFC-Standards entsprechen. Zum Beispiel weiß ich, dass PHP dies nicht tut.

Rob Williams
quelle
7

Ja, der Speicherplatz wird normalerweise mit "% 20" codiert. Alle Parameter, die an eine URL übergeben werden, sollten aus Sicherheitsgründen verschlüsselt werden.

user54650
quelle
6

Die URL kann ein Leerzeichen enthalten und wird in den meisten Browsern als% 20 angezeigt. Die Regeln für die Browserkodierung ändern sich jedoch häufig und wir können nicht davon abhängen, wie ein Browser die URL anzeigt.

Stattdessen können Sie das Leerzeichen in der URL durch ein beliebiges Zeichen ersetzen, von dem Sie glauben, dass es die URL lesbarer und 'hübscher' macht;) ..... O so allgemeine Zeichen, die bevorzugt werden, sind "-", "_", "+" .... aber dies sind nicht die Zwänge, so dass Sie jedes Zeichen verwenden können, das nicht bereits in der URL enthalten sein soll.

Bitte vermeiden Sie%, &,}, {,], [, /,>, <als Ersatz für URL-Leerzeichen, da diese in bestimmten Browsern und Plattformen einen Fehler verursachen können.

Wie Sie sehen können, verwendet der Stak-Überlauf selbst das Zeichen '-' als Leerzeichen (% 20).

Viel Spaß beim Fragen.

AM Web Surfer
quelle
5

Urls sollten keine Leerzeichen enthalten. Wenn Sie eine Adresse adressieren müssen, die dies tut, verwenden Sie den codierten Wert von%20

Chris Ballance
quelle
5

Kann jemand auf einen RFC verweisen, der angibt, dass eine URL mit einem Leerzeichen codiert werden muss?

URIs und damit URLs sind in RFC 3986 definiert.

Wenn Sie sich die dort definierte Grammatik ansehen, werden Sie schließlich feststellen, dass ein Leerzeichen niemals Teil einer syntaktisch zulässigen URL sein kann. Daher ist der Begriff "URL mit einem Leerzeichen" ein Widerspruch an sich.

Julian Reschke
quelle
3

Zur Beantwortung Ihrer Frage. Ich würde sagen, dass Anwendungen häufig Leerzeichen in Werten ersetzen, die in URLs verwendet werden. Der Grund dafür ist normalerweise, die schwer zu lesende prozentuale (URI) Codierung zu vermeiden, die auftritt.

Lesen Sie diesen Wikipedia-Artikel über Prozentcodierung .

Eric Schoonover
quelle
2

Firefox 3 zeigt %20s in URLs als Leerzeichen in der Adressleiste an.

Sophie Alpert
quelle
Dies ist keine richtige Antwort auf eine ziemlich einfache Frage : "Is a URL allowed to contain a space?". Eher ein Kommentar.
Roko C. Buljan