Alguém sabe a lista completa de caracteres que podem ser usados dentro de um GET sem serem codificados? No momento, estou usando AZ az e 0-9 ... mas estou procurando descobrir a lista completa.
Também estou interessado em saber se há uma especificação liberada para a próxima adição de URLs em chinês e árabe (como obviamente isso terá um grande impacto na minha pergunta)
!*'();:@&=+$,/?#[]
ou sem reservasA-Za-z0-9_.~-
(ou um carácter de percentagem%
, como parte de um por cento de codificação)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
para encontrar URL com caracteres incorretos. Talvez seja útil para outra pessoa também.Respostas:
Da especificação RFC 1738 :
EDIT: Como aponta corretamente @Jukka K. Korpela, esta RFC foi atualizada pela RFC 3986 . Isso expandiu e esclareceu os caracteres válidos para o host, infelizmente não é fácil copiar e colar, mas farei o meu melhor.
Na primeira ordem correspondente:
fonte
A-Za-z0-9_.-~
caracteres não reservados e reservados no início desta resposta.!*'();:@&=+$,/?#[]
Ele pode economizar tempo para as pessoasreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
diz que esses são caracteres não reservados para o RFC 3986 (seção 2.3) e caracteres reservados (seção 2.2), caso precisem manter seu significado especial. E também um caractere de porcentagem como parte de uma codificação de porcentagem.
fonte
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
A lista completa dos 66 caracteres não reservados está na RFC3986, aqui: http://tools.ietf.org/html/rfc3986#section-2.3
Este é qualquer caractere no seguinte conjunto de expressões regulares:
fonte
{}^\~
ebacktick
como inseguro. E o RFC3986 lista \ como não seguro por causa do sistema de arquivos. Isso significa que também{}^
pode ser usado.-
ou colocá-lo no início ou no final da classe de personagem, porque[.-~]
na verdade, contém todos os caracteres ASCII de 46 a 126.Testei-o solicitando meu site (apache) com todos os caracteres disponíveis no meu teclado alemão como parâmetro de URL:
Estes não foram codificados:
Não codificado após
urlencode()
:Não codificado após
rawurlencode()
:Nota: Antes do PHP 5.3.0
rawurlencode()
codificado~
por causa da RFC 1738 . Mas isso foi substituído pelo RFC 3986, portanto é seguro usá-lo agora. Mas não entendo por que, por exemplo,{}
são codificadosrawurlencode()
porque não são mencionados na RFC 3986.Um teste adicional que fiz foi referente à vinculação automática em textos de correio. Testei o Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de e yahoo.de e eles vincularam completamente os URLs contendo esses caracteres:
É claro que o
?
link também estava vinculado, mas apenas se fosse usado uma vez.Algumas pessoas sugerem agora usar apenas os
rawurlencode()
caracteres, mas você já ouviu falar que alguém teve problemas para abrir esses sites?Asterisk
http://wayback.archive.org/web/*/http://google.com
Colon
https://en.wikipedia.org/wiki/Wikipedia:About
Além disso,
https://plus.google.com/+google
Sinal, dois pontos, vírgula e ponto de exclamação
https: //www.google.com/maps/place/USA/@36.2218457, ...
Por esse motivo, esses caracteres devem ser utilizáveis sem codificação sem problemas. Claro que você não deve usar
&;
por causa de sequências de codificação como&
. O mesmo motivo é válido%
, pois costumava codificar caracteres em geral. E=
como atribui um valor ao nome de um parâmetro.Finalmente, eu diria que não há problema em usar estes não codificados:
Mas se você espera URLs gerados aleatoriamente, não deve usá-lo
.!
, porque eles marcam o final de uma frase e alguns aplicativos de email não vinculam automaticamente o último caractere do URL. Exemplo:fonte
+
sinal especialmente :-DA partir daqui
fonte
Estes estão listados em RFC3986 . Consulte o ABNF coletado para URI para ver o que é permitido onde e o regex para análise / validação.
fonte
O RFC3986 define dois conjuntos de caracteres que você pode usar em um URI:
Caracteres reservados :
:/?#[]@!$&'()*+,;=
Caracteres não reservados :
A-Za-z0-9-_.~
fonte
A próxima mudança é para nomes de domínio em árabe e chinês, não URIs. Os URIs internacionalizados são chamados IRIs e são definidos na RFC 3987 . No entanto, tendo dito que eu recomendaria não fazer isso sozinho, contando com uma biblioteca já testada, já que existem muitas opções de codificação / decodificação de URI e o que é considerado seguro por especificação, versus o que é seguro pelo uso real (navegadores) .
fonte
Se você deseja dar um tipo especial de experiência aos usuários, pode usar
pushState
uma variedade de caracteres para o URL do navegador:fonte