É permitido que um URL contenha um espaço?

132

É permitido que um URI (especificamente um URL HTTP) contenha um ou mais caracteres de espaço? Se um URL deve ser codificado, é +apenas uma convenção comumente seguida ou uma alternativa legítima?

Em particular, alguém pode apontar para uma RFC que indica que uma URL com um espaço deve ser codificada?

Motivação para a pergunta: durante o teste beta de um site, observei que alguns URLs foram construídos com espaços. O Firefox pareceu fazer a coisa certa, o que me surpreendeu! Mas eu queria poder apontar os desenvolvedores para uma RFC para que eles sentissem a necessidade de corrigir esses URLs.

Joe Casadonte
fonte
superset que veio mais tarde: o que são todos os caracteres inválidos: stackoverflow.com/questions/1547899/...
Ciro Santilli郝海东冠状病六四事件法轮功

Respostas:

101

Conforme RFC 1738 :

Inseguro:

Os caracteres podem não ser seguros por vários motivos. O caractere de espaço é inseguro, pois espaços significativos podem desaparecer e espaços insignificantes podem ser introduzidos quando URLs são transcritas ou digitadas ou submetidas ao tratamento de programas de processamento de texto. Os caracteres "<"e ">"são inseguros porque são usados ​​como delimitadores em torno de URLs em texto livre; as aspas ( """) são usadas para delimitar URLs em alguns sistemas. O caractere "#"é inseguro e deve sempre ser codificado porque é usado na World Wide Web e em outros sistemas para delimitar uma URL de um identificador de fragmento / âncora que possa segui-lo. O personagem"%"é inseguro porque é usado para codificações de outros caracteres. Outros caracteres são inseguros porque é conhecido que os gateways e outros agentes de transporte às vezes modificam esses caracteres. Estes personagens são "{", "}", "|", "\", "^", "~", "[", "]", e "`".

Todos os caracteres não seguros devem sempre ser codificados em um URL . Por exemplo, o caractere "#"deve ser codificado nas URLs, mesmo em sistemas que normalmente não lidam com identificadores de fragmento ou âncora, para que, se a URL for copiada para outro sistema que os use, não seja necessário alterar a codificação da URL.

Marc Novakowski
fonte
2
1738 foi superceeded por 2396. ietf.org/rfc/rfc2396.txt Essa é a especificação atual Uri. Porém, não importa nesse caso.
31609 Steve Severance
40
E 2396 foi substituído por 3986. Muitas pessoas entendem errado, pois as RFCs são imutáveis ​​e, portanto, não informam ao leitor que elas foram obsoletas. Dica: use tools.ietf.org/html/rfcnnnn , como tools.ietf.org/html/rfc2396 , em vez disso, ele exibe os metadados ausentes na parte superior.
Julian Reschke
43

Por que ele precisa ser codificado? Uma solicitação é assim:

GET /url HTTP/1.1
(Ignoring headers)

Existem 3 campos separados por um espaço em branco. Se você colocar um espaço no seu URL:

GET /url end_url HTTP/1.1

Você sabe que possui 4 campos, o servidor HTTP informará que é uma solicitação inválida.

GET /url%20end_url HTTP/1.1

3 campos => válido

Nota: na string de consulta (depois de?), Um espaço geralmente é codificado como um +

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

ao invés de

GET /url?var=foo%20bar HTTP/1.1 
Julien
fonte
E se var realmente fosse "foo + bar" e não "foo bar"?
Ivo3185
2
Eu diria que isso é um requisito da camada de transporte, não da própria especificação URI. GET é claramente uma propriedade da especificação http: não da especificação da URL. Da mesma forma, você pode argumentar que as aspas nos URLs "devem" ser codificadas porque, caso contrário, as páginas da Web quebrariam. Mas isso é uma propriedade das limitações de formatação HTML (contra as quais existem outras estratégias), não uma propriedade da especificação de URL.
Kent Fredric 23/01
ietf.org/rfc/rfc1738.txt - Caracteres inseguros, incluindo espaço), devem ser codificados #
Julien
@KentFredric É mais provável que a camada de apresentação , não a camada de transporte . Como Julien (quase) escreve, a especificação URI original ( RFC 1630 ) contém essa restrição, portanto faz parte da própria especificação URI, independentemente de seus sentimentos pessoais. Como a especificação do URI foi escrita após os rascunhos do HTTP, é muito possível que os URIs tenham sido projetados com o HTTP em mente, incluindo a proibição contra o uso de espaços, mas isso realmente não importa, não é? A verdade é que a especificação é o que é a especificação.
31418 Christopher Schultz
38

Resposta mais curta: não, você deve codificar um espaço; que é correto para codificar um espaço como +, mas apenas na cadeia de consulta; no caminho que você deve usar %20.

Peter Hilton
fonte
1
Olá, também estou confuso, em algum momento vi o livro usar "+", mas em algum momento "% 20", você pode mostrar algum exemplo disso? Quando o usuário envia o formulário, como o formulário codifica o espaço? com qual personagem?
GMsoF 7/11/12
1
Veja esta resposta para detalhes adicionais.
DavidRR
e quanto à parte de fragmento / hash? Como os espaços devem ser codificados lá?
gumkins
@ Gumkins: o fragmento (# e depois) não é enviado ao servidor. Na prática, você pode usar% 20 ou + em qualquer lugar para codificar um espaço.
Julien
9

Os URLs são definidos na RFC 3986 , embora outras RFCs sejam relevantes também, mas a RFC 1738 seja obsoleta.

Eles podem não ter espaços, junto com muitos outros caracteres. Como esses caracteres proibidos geralmente precisam ser representados de alguma forma, existe um esquema para codificá-los em uma URL, convertendo-os em seu equivalente hexadecimal ASCII com um prefixo "%".

A maioria das linguagens / plataformas de programação fornece funções para URLs de codificação e decodificação, embora elas possam não aderir adequadamente aos padrões RFC. Por exemplo, eu sei que o PHP não.

Rob Williams
fonte
7

Sim, o espaço geralmente é codificado para "% 20". Todos os parâmetros que passam para um URL devem ser codificados, simplesmente por razões de segurança.

user54650
fonte
6

O URL pode ter um caractere de espaço e será exibido como% 20 na maioria dos navegadores, mas as regras de codificação do navegador mudam com bastante frequência e não podemos depender de como um navegador exibirá o URL.

Então, em vez disso, você pode substituir o Caractere de Espaço na URL por qualquer caractere que ache que a tornará mais legível e 'Bonita';) ..... Os caracteres gerais preferidos são "-", "_", "+" .... mas essas não são as compulsões, portanto você pode usar qualquer caractere que não deveria estar no URL.

Evite%, &,}, {,], [, /,>, <como a Substituição de caracteres de espaço de URL, pois eles podem gerar um erro em determinados navegadores e plataformas.

Como você pode ver, o próprio estouro do Stak usa o caractere '-' como substituição de espaço (% 20).

Tenha um questionamento feliz.

AM Web Surfer
fonte
5

Os URLs não devem ter espaços neles. Se você precisar endereçar um que o faça, use seu valor codificado de%20

Chris Ballance
fonte
5

Alguém pode apontar para uma RFC indicando que uma URL com um espaço deve ser codificada?

URIs e, portanto, URLs, são definidos no RFC 3986.

Se você observar a gramática definida por lá, notará que um caractere de espaço nunca pode fazer parte de uma URL sintaticamente legal, portanto, o termo "URL com um espaço" é uma contradição em si.

Julian Reschke
fonte
3

Para responder sua pergunta. Eu diria que é bastante comum que aplicativos substituam espaços em valores que serão usados ​​em URLs. A razão para isso é geralmente evitar a codificação de porcentagem de leitura mais difícil (URI) que ocorre.

Confira este artigo da Wikipedia sobre codificação percentual .

Eric Schoonover
fonte
2

O Firefox 3 exibirá %20s nos URLs como espaços na barra de endereço.

Sophie Alpert
fonte
Esta não é uma resposta adequada à pergunta simples bastante: "Is a URL allowed to contain a space?". Antes um comentário.
Roko C. Buljan