São rectos permitida em URLs?
-
09-06-2019 - |
Pergunta
São rectos em URLs permitidos?
Eu notei que Apache commons HttpClient (3.0.1) lança uma IOException, o wget e o Firefox no entanto aceitar colchetes.
Exemplo de URL:
http://example.com/path/to/file[3].html
Meu cliente HTTP encontros URLs tal, mas eu não tenho certeza se a corrigir o código ou lançar uma exceção (como, na verdade, deveria ser).
Solução
RFC 3986 estados
Um host identificado por um Internet Protocolo endereço literal, versão 6 [RFC3513] ou mais tarde, é distinto colocando o IP literal dentro colchetes ("[" e "]").Este é o único lugar onde o colchete caracteres são permitidos na URI a sintaxe.
Então você não deve estar vendo tais URI em estado selvagem na teoria, como eles devem chegar codificado.
Outras dicas
Eu sei que essa pergunta é um pouco antigo, mas eu só queria ressaltar que o PHP usa colchetes para passar matrizes em uma URL.
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
Neste caso, $_GET['bar']
irá conter array(1, 2, 3)
.
De qualquer navegador da web ou o software habilitado que aceita URLs e não está lançando uma exceção quando os caracteres especiais são introduzidos é quase garantida para ser codificação de caracteres especiais por trás das cenas.Chaves, colchetes, espaços, etc., todos têm especial codificado maneiras de representá-los de forma a não produzir conflitos.Conforme as respostas anteriores, a forma mais segura para lidar com a URL-codificá-los antes de entregá-los para algo que vai tentar resolver o URL.
Praticamente a única caracteres que não são permitidos em nomes de caminho são # e ?como eles significam o fim do caminho.
O uri rfc terá a definative resposta:
http://www.ietf.org/rfc/rfc1738.txt
Inseguro:
Os personagens podem não ser seguros para um número de razões.O espaço caráter não é seguro porque espaços significativos podem desaparecer e insignificante espaços podem ser introduzidos quando os URLs são transcritos ou typeset ou sujeito para o tratamento de programas de processamento de texto.Os caracteres "<"e ">" são seguros, pois eles são usados como o delimitadores de cerca de URLs no texto livre;as aspas (""") é usado para delimitar URLs em alguns sistemas.O caractere "#" não é seguro e deve sempre ser codificado porque ele é usado na World Wide Web e em outras sistemas para delimitar uma URL a partir de um identificador de fragmento/âncora que pode siga-a.O caractere "%" não é seguro porque ele é usado para codificações de outros personagens.Outros caracteres não são seguros, pois gateways e outros agentes de transporte são conhecidos por vezes, modificar tais caracteres.Estes caracteres são "{", "}", "|", "\", "^", "~", "[", "]", e "`".
Todos os caracteres não seguros deve sempre ser codificado dentro de um URL.Para exemplo, o caractere "#" deve ser codificado dentro de URLs mesmo em sistemas que, normalmente, não lidar com o fragmento ou âncora identificadores, de modo que, se a URL é copiado para outro sistema que não usá-los, não será necessário alterar a codificação de URL.
A resposta é que eles deve ser hexadecimal codificado, mas sabendo postel da lei, a maioria das coisas vai aceitá-los literalmente.
Para utilizar o commons HttpClient classe, você quer olhar para a org.apache.o commons.httpclient.util.URIUtil classe, especificamente o encode() método.Use-a para URI-codificar a URL antes de tentar buscá-la.
StackOverflow parece não codificá-los:
Melhor para URL encode aqueles que, como eles claramente não são suportados em todos os servidores web.Às vezes, mesmo quando não há um padrão, não é todo mundo segue.
De acordo com o URL especificação, os colchetes não são válidos URL caracteres.
Aqui está o relevante trechos:
O "nacional" e "pontuação" caracteres não aparecem em qualquer produções e, portanto, podem não aparecer em URLs.
nacional { | } | vline| [ | ] | \ | ^ | ~
pontuação < | >
Colchetes [
e ]
em URLs não são suportadas.
Substituí-los por %5B
e %5D
:
Usando uma linha de comando, o exemplo a seguir é baseado no
bash
esed
:url='http://example.com?day=[0-3][0-9]' encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
Usando Java
URLEncoder.encode(String s, String enc)
Usando PHP
rawurlencode()
ouurlencode()
<?php echo '<a href="http://example.com/day/', rawurlencode('[0-3][0-9]'), '">'; ?>
saída:
<a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
ou:
<?php $query_string = 'day=' . urlencode('[0-3][0-9]') . '&month=' . urlencode('[0-1][0-9]'); echo '<a href="http://example.com?', htmlentities($query_string), '">'; ?>
Utilizando sua linguagem de programação favorita...Por favor, estender esta resposta por postar um comentário ou editando diretamente esta resposta para adicionar a função que você usar, a partir de sua linguagem de programação ;-)
Para mais detalhes, consulte o RFC 3986 especificar a sintaxe de URL.O Anexo A é sobre %-encoding
na seqüência de caracteres de consulta (entre parênteses como pertencentes a "gen-delims" para ser %-encoded
).
Colchetes são considerados seguros, mas a maioria dos navegadores irá analisar os corretamente.Dito isto, é melhor substituir colchetes com alguns outros personagens.