2009-01-31 13 views
107

Darf ein URI (speziell eine HTTP-URL) ein oder mehrere Leerzeichen enthalten? Wenn eine URL codiert werden muss, ist + nur eine häufig verwendete Konvention oder eine legitime Alternative?Darf eine URL ein Leerzeichen enthalten?

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

Motivation für die Frage: Während Beta-Test einer Website, habe ich festgestellt, dass einige URLs mit Leerzeichen in ihnen erstellt wurden. Firefox schien das Richtige zu tun, was mich überrascht hat! Aber ich wollte in der Lage sein, die Entwickler auf einen RFC hinzuweisen, damit sie diese URLs korrigieren müssten.

+0

Obermenge, die später kam: Was sind die ungültigen Zeichen: http://StackOverflow.com/Questions/1547899/which-characters-make-a-url-invalid –

+0

** Related: ** [In einer URL, sollten Leerzeichen mit% 20 oder + codiert werden?] (http://stackoverflow.com/q/1211229/1497596) – DavidRR

Antwort

87

Per RFC 1738:

Unsafe:

Charaktere können für eine Reihe von Gründen unsicher sein. Das Leerzeichen Zeichen ist unsicher, da signifikante Leerzeichen verschwinden können und unbedeutende Leerzeichen eingefügt werden können, wenn URLs transkribiert oder gesetzt oder der Verarbeitung von Textverarbeitungsprogrammen unterzogen werden. Die Zeichen "<" und ">" sind unsicher, da sie als Trennzeichen für URLs im Freitext verwendet werden. Das Anführungszeichen (""") wird verwendet, um URLs in einigen Systemen auf zu begrenzen.Das Zeichen "#" ist unsicher und sollte immer codiert sein, da es in World Wide Web und in anderen -Systemen verwendet wird, um eine URL von einer Fragment-/Anker-ID, die möglicherweise folgt, zu begrenzen. Das Zeichen "%" ist nicht sicher, da es für Codierungen anderer Zeichen verwandt wird. Andere Zeichen sind unsicher, da Gateways und andere Transportagenten dafür bekannt sind, solche Zeichen manchmal zu modifizieren . Diese Zeichen sind "{", "}", "|", "\", "^", "~", "[", "]" und "`".

Alle unsicheren Zeichen müssen immer in einer URL codiert sein. Für Beispiel muss das Zeichen "#" innerhalb von URLs auch in Systeme codiert werden, die normalerweise nicht mit Fragment oder Anker Bezeichner beschäftigen, so dass, wenn die URL in ein anderes System kopiert wird, dass sie verwendet, wird es nicht notwendig sein Ändern Sie die URL-Codierung.

+1

1738 wurde von 2396 übersteuert. http://www.ietf.org/rfc/rfc2396.txt Das ist die aktuelle Uri-Spezifikation. In diesem Fall spielt es jedoch keine Rolle. –

+33

Und 2396 wurde durch 3986 ersetzt. Viele Leute bekommen das falsch, da RFCs unveränderlich sind, und so dem Leser nicht sagen, dass sie veraltet sind. Hinweis: Verwenden Sie http://tools.ietf.org/html/rfcnnnn, z. B. http://tools.ietf.org/html/rfc2396, stattdessen werden die fehlenden Metadaten angezeigt. –

5

Ja, der Speicherplatz ist normalerweise in "% 20" codiert. Alle Parameter, die an eine URL übergeben werden, sollten aus Sicherheitsgründen codiert werden.

-3

Habe das nicht gesehen. Vielleicht können Sie den Webserver so konfigurieren, dass er akzeptiert ...

3

URLs sollten nicht Leerzeichen in ihnen haben. Wenn Sie eine Adresse adressieren müssen, verwenden Sie den codierten Wert

2

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

4

Um Ihre Frage zu beantworten. Ich würde sagen, dass Anwendungen häufig Leerzeichen in Werten ersetzen, die in URLs verwendet werden. Der Grund dafür besteht darin, die schwierig zu lesende prozentuale (URI) Codierung zu vermeiden.

Schau dir diesen Wikipedia-Artikel über Percent-encoding an.

9

URLs sind in RFC 3986 definiert, obwohl andere RFCs ebenfalls relevant sind, aber RFC 1738 veraltet ist.

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

Die meisten Programmiersprachen/Plattformen bieten Funktionen zum Verschlüsseln und Entschlüsseln von URLs, obwohl sie möglicherweise nicht den RFC-Standards entsprechen. Zum Beispiel weiß ich, dass PHP das nicht tut.

26

Kürzere Antwort: Nein, Sie müssen ein Leerzeichen codieren; es ist ist korrekt, ein Leerzeichen wie +, aber nur in der Abfragezeichenfolge zu codieren; Im Pfad müssen Sie verwenden.

+1

Hallo, ich bin auch verwirrt, irgendwann sah ich das Buch "+" verwenden, aber irgendwann "% 20", können Sie ein Beispiel dafür zeigen? Wenn der Benutzer das Formular abschickt, wie codiert das Formular den Raum? mit welchem ​​Charakter? – GMsoF

+1

Weitere Details finden Sie in dieser Antwort (http://stackoverflow.com/a/1211256/1497596). – DavidRR

+0

was ist mit Fragment/Hash-Teil? Wie sollen Räume dort codiert werden? – gumkins

40

Warum muss es codiert werden? Eine Anfrage sieht folgendermaßen aus:

GET /url HTTP/1.1 
(Ignoring headers) 

Es gibt 3 Felder, die durch einen Leerraum getrennt sind. Wenn Sie ein Leerzeichen in Ihrer URL setzen:

GET /url end_url HTTP/1.1 

Sie wissen, 4 Felder haben, wird der HTTP-Server Ihnen sagen, es ist eine ungültige Anfrage.

GET /url%20end_url HTTP/1.1 

3 Felder => gültig

Hinweis: in dem Query-String (? Nach) ist ein Raum in der Regel als + codiert

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

statt

GET /url?var=foo%20bar HTTP/1.1 
+0

Was wäre, wenn var wirklich "foo + bar" und nicht "foo bar" wäre? – Ivo3185

+8

A + muss als% 2b codiert werden – Julien

+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 die URL-Spezifikation. Ähnlich könnte man argumentieren Zitate in URLs "muss" codiert werden, weil sonst Webseiten brechen würden. Aber das ist eine Eigenschaft von HTML-Formatierungsbeschränkungen (gegen die es andere Strategien gibt), keine Eigenschaft der URL-Spezifikation. –

5

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

URIs und damit URLs werden definiert in RFC 3986.

Wenn man sich die Grammatik aussehen dort definiert werden Sie schließlich beachten Sie, dass ein Leerzeichen nie Teil eines syntaktisch Rechts URL sein kann, so Der Begriff "URL mit einem Leerzeichen" ist ein Widerspruch in sich.

4

URL kann ein Leerzeichen enthalten und sie werden in den meisten Browsern als% 20 angezeigt, aber die Browserkodierungsregeln ändern sich ziemlich oft und wir können nicht davon abhängen, wie ein Browser die URL anzeigt.

Also stattdessen können Sie das Leerzeichen in der URL durch ein beliebiges Zeichen ersetzen, von dem Sie denken, dass es die URL lesbarer und 'hübsch' machen soll;) .....O so allgemeine Zeichen, die bevorzugt werden, sind "-", "_", "+" .... aber das sind nicht die Zwänge, so dass Sie eines der Zeichen verwenden können, das nicht in der URL Already sein soll.

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

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

Haben Sie eine glückliche Befragung.

Verwandte Themen