Un URL può contenere uno spazio?


132

Un URI (in particolare un URL HTTP) può contenere uno o più caratteri di spazio? Se un URL deve essere codificato, è +solo una convenzione comunemente seguita o un'alternativa legittima?

In particolare, qualcuno può puntare a un RFC che indica che un URL con uno spazio deve essere codificato?

Motivo della domanda: durante il beta test di un sito Web, ho notato che alcuni URL sono stati costruiti con spazi all'interno. Firefox sembrava fare la cosa giusta, il che mi ha sorpreso! Ma volevo essere in grado di indirizzare gli sviluppatori a un RFC in modo che sentissero la necessità di correggere quegli URL.


superset che è venuto dopo: che cosa sono tutti i caratteri non validi: stackoverflow.com/questions/1547899/...
Ciro Santilli郝海东冠状病六四事件法轮功

Risposte:


101

Secondo RFC 1738 :

Unsafe:

I personaggi possono non essere sicuri per una serie di motivi. Il carattere spaziale non è sicuro perché possono scomparire spazi significativi e possono essere introdotti spazi insignificanti quando gli URL vengono trascritti o composti o sottoposti al trattamento di programmi di elaborazione testi. I personaggi "<"e ">"sono pericolosi perché sono utilizzati come delimitatori URL in testo libero; il segno di virgolette ( """) viene utilizzato per delimitare gli URL in alcuni sistemi. Il personaggio "#"non è sicuro e deve essere sempre codificato perché utilizzato nel World Wide Web e in altri sistemi per delimitare un URL da un identificatore di frammento / ancoraggio che potrebbe seguirlo. Il personaggio"%"non è sicuro perché viene utilizzato per la codifica di altri caratteri. Altri personaggi non sono sicuri perché i gateway e altri agenti di trasporto sono noti a volte modificare tali caratteri. Questi personaggi sono "{", "}", "|", "\", "^", "~", "[", "]", e "`".

Tutti i caratteri non sicuri devono essere sempre codificati in un URL . Ad esempio, il carattere "#"deve essere codificato negli URL anche nei sistemi che normalmente non gestiscono gli identificatori di frammenti o di ancoraggi, in modo che se l'URL viene copiato in un altro sistema che li utilizza, non sarà necessario modificare la codifica URL.


2
Il 1738 è stato superato dal 2396. ietf.org/rfc/rfc2396.txt Questa è l'attuale specifica Uri. Non importa in questo caso però.
Steve Severance,

40
E 2396 è stato sostituito da 3986. Molte persone sbagliano, poiché le RFC sono immutabili e quindi non dicono al lettore che sono state obsolete. Suggerimento: usa tools.ietf.org/html/rfcnnnn , come tools.ietf.org/html/rfc2396 , invece mostra i metadati mancanti in cima.
Julian Reschke,

43

Perché deve essere codificato? Una richiesta è simile alla seguente:

GET /url HTTP/1.1
(Ignoring headers)

Ci sono 3 campi separati da uno spazio bianco. Se inserisci uno spazio nel tuo URL:

GET /url end_url HTTP/1.1

Sai che hai 4 campi, il server HTTP ti dirà che è una richiesta non valida.

GET /url%20end_url HTTP/1.1

3 campi => valido

Nota: nella stringa di query (dopo?), Uno spazio è generalmente codificato come +

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

piuttosto che

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

E se var fosse davvero "foo + bar" e non "foo bar"?
Ivo3185,

2
Direi che è un requisito del livello di trasporto, non della specifica URI stessa. GET è chiaramente una proprietà della specifica http: non della specifica URL. Allo stesso modo potresti sostenere che le virgolette negli URL "devono" essere codificate perché altrimenti le pagine web si spezzerebbero. Ma questa è una proprietà delle limitazioni della formattazione HTML (contro cui esistono altre strategie), non una proprietà della specifica dell'URL.
Kent Fredric,

ietf.org/rfc/rfc1738.txt - I caratteri non sicuri incluso lo spazio) dovrebbero essere codificati
Julien

@KentFredric È più probabile la presentazione livello di , non il livello di trasporto . Come scrive Julien (quasi), la specifica URI originale ( RFC 1630 ) contiene questa restrizione, quindi fa parte della specifica URI stessa indipendentemente dai tuoi sentimenti personali. Dal momento che le specifiche URI sono state scritte dopo le bozze HTTP, è molto probabile che gli URI siano stati progettati pensando all'HTTP, incluso il divieto di utilizzare gli spazi, ma non importa, vero? La verità è che le specifiche sono le specifiche.
Christopher Schultz,

38

Risposta più breve: no, devi codificare uno spazio; esso è corretto per codificare uno spazio +, ma solo nella stringa di interrogazione; nel percorso che devi usare %20.


1
Ciao, anch'io sono confuso, a volte ho visto il libro usare "+" ma a volte "% 20", puoi mostrare qualche esempio per questo? Quando l'utente invia il modulo, in che modo il modulo codifica lo spazio? con quale personaggio?
GMsoF,

1
Vedi questa risposta per ulteriori dettagli.
DavidRR,

che dire di frammento / parte di hash? Come dovrebbero essere codificati gli spazi lì?
Gumkins,

@gumkins: il frammento (# e dopo) non viene inviato al server. In pratica, puoi usare% 20 o + ovunque per codificare uno spazio.
Julien,

9

Gli URL sono definiti in RFC 3986 , sebbene anche altri RFC siano rilevanti, ma RFC 1738 è obsoleto.

Potrebbero non avere spazi al loro interno, insieme a molti altri personaggi. Poiché quei caratteri proibiti spesso devono essere rappresentati in qualche modo, esiste uno schema per codificarli in un URL traducendoli nel loro equivalente esadecimale ASCII con un prefisso "%".

La maggior parte dei linguaggi / piattaforme di programmazione fornisce funzioni per la codifica e la decodifica degli URL, sebbene possano non aderire correttamente agli standard RFC. Ad esempio, so che PHP no.


7

Sì, di solito lo spazio è codificato in "% 20". Tutti i parametri che passano a un URL devono essere codificati, semplicemente per motivi di sicurezza.


6

L'URL può contenere un carattere spaziale e verranno visualizzati come% 20 nella maggior parte dei browser, ma le regole di codifica del browser cambiano abbastanza spesso e non possiamo dipendere da come un browser visualizzerà l'URL.

Quindi, invece, puoi sostituire il carattere spaziale nell'URL con qualsiasi carattere che ritieni possa rendere l'URL più leggibile e 'Abbastanza';) ..... O così i caratteri generali preferiti sono "-", "_", "+" .... ma queste non sono le compulsioni, quindi puoi usare qualsiasi personaggio che non dovrebbe essere già presente nell'URL.

Evita%, &,}, {,], [, /,>, <come sostituzione del carattere dello spazio URL in quanto possono generare un errore su determinati browser e piattaforme.

Come puoi vedere, l'overflow di Stak stesso usa il carattere '-' come sostituzione Space (% 20).

Fai un felice interrogatorio.


5

Gli URL non devono contenere spazi. Se è necessario indirizzarne uno che lo utilizza, utilizzare il valore codificato di%20


5

Qualcuno può puntare a un RFC che indica che un URL con uno spazio deve essere codificato?

Gli URI, e quindi gli URL, sono definiti in RFC 3986.

Se guardi la grammatica definita laggiù alla fine noterai che un personaggio spaziale non può mai far parte di un URL sintatticamente legale, quindi il termine "URL con uno spazio" è una contraddizione in sé.


3

Per rispondere alla tua domanda. Direi che è abbastanza comune per le applicazioni sostituire gli spazi nei valori che verranno utilizzati negli URL. La ragione di ciò è di solito evitare la codifica percentuale (URI) più difficile da leggere che si verifica.

Dai un'occhiata a questo articolo di Wikipedia sulla codifica in percentuale .


2

Firefox 3 visualizzerà gli %20s negli URL come spazi nella barra degli indirizzi.


Questa non è una risposta adeguata alla domanda abbastanza semplice: "Is a URL allowed to contain a space?". Piuttosto un commento.
Roko C. Buljan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.