Espaços em URLs?

O w3fools afirma que as URLs podem conter espaços: http://w3fools.com/#html_urlencode

Isso é verdade? Como um URL pode conter um espaço não codificado?

Tenho a impressão de que a linha de solicitação de uma solicitação HTTP usa um espaço como um delimitador, sendo formatada como {the method}{space}{the path}{space}{the protocol} :

 GET /index.html http/1.1 

Portanto, como pode um URL conter um espaço? Se puder, de onde vem a prática de replace espaços com + ?

Um URL não deve conter um espaço literal. Ele deve ser codificado usando a codificação percentual ou uma codificação diferente que usa caracteres seguros para URL (como application / x-www-form-urlencoded que usa + vez de %20 para espaços).

Mas se a afirmação é certa ou errada depende da interpretação: Sintaticamente, um URI não deve conter um espaço literal e deve ser codificado; semanticamente, um %20 não é um espaço (obviamente), mas representa um espaço.

Eles são realmente tolos. Se você olhar para o RFC 3986 Apêndice A, verá que “espaço” simplesmente não é mencionado em nenhum lugar na gramática para definir uma URL. Como não é mencionado em nenhum lugar da gramática, a única maneira de codificar um espaço é com a porcentagem de codificação ( %20 ).

Na verdade, o RFC até afirma que os espaços são delimitadores e devem ser ignorados:

Em alguns casos, espaços em branco extras (espaços, quebras de linha, guias, etc.) podem ser adicionados para dividir um URI longo entre linhas. O espaço em branco deve ser ignorado quando o URI é extraído.

e

Para maior robustez, o software que aceita URIs digitadas pelo usuário deve tentar reconhecer e eliminar os delimitadores e os espaços em branco incorporados.

Curiosamente, o uso de + como codificação de espaço não é mencionado no RFC, embora seja reservado como um sub-delimitador. Eu suspeito que seu uso seja apenas convencional ou coberto por um RFC diferente (possivelmente HTTP).

Espaços são simplesmente substituídos por “% 20” como:

http://www.example.com/my%20beautiful%20page

A informação lá é que acho parcialmente correta:

Isso não é verdade. Um URL pode usar espaços. Nada define que um espaço é substituído por um sinal +.

Como você observou, uma URL NÃO pode usar espaços. O pedido de HTTP seria estragado. Não tenho certeza de onde o + está definido, embora %20 seja padrão.