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).

Foi útil?

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:

https://stackoverflow.com/search?q=square+brackets+[url]

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 e sed:

    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() ou urlencode()

    <?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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top