Domanda

Sono consentite le parentesi quadre negli URL?

ho notato che Apache Commons HttpClient (3.0.1) lancia una IOException, wget e Firefox accettano tuttavia le parentesi quadre.

Esempio di URL:

http://example.com/path/to/file[3].html

Il mio client HTTP rileva tali URL ma non sono sicuro se applicare una patch al codice o generare un'eccezione (come dovrebbe essere in realtà).

È stato utile?

Soluzione

RFC3986 stati

Un host identificato da un indirizzo letterale del protocollo Internet, versione 6 [RFC3513] o successivamente, si distingue racchiudendo il letterale IP tra parentesi quadrate ([" e "]).Questo è l'unico posto in cui i caratteri della staffa quadrata sono consentiti nella sintassi dell'URI.

Quindi in teoria non dovresti vedere tali URI in circolazione, poiché dovrebbero arrivare codificati.

Altri suggerimenti

So che questa domanda è un po' vecchia, ma volevo solo notare che PHP utilizza le parentesi per passare gli array in un URL.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

In questo caso $_GET['bar'] conterrà array(1, 2, 3).

È quasi garantito che qualsiasi browser o software abilitato al Web che accetti URL e non generi un'eccezione quando vengono introdotti caratteri speciali codifichi i caratteri speciali dietro le quinte.Parentesi graffe, parentesi quadre, spazi, ecc. hanno tutti modi speciali codificati per rappresentarli in modo da non produrre conflitti.Come per le risposte precedenti, il modo più sicuro per gestirli è codificarli nell'URL prima di consegnarli a qualcosa che tenterà di risolvere l'URL.

Praticamente gli unici caratteri non ammessi nei nomi dei percorsi sono # e ?poiché indicano la fine del percorso.

L'uri RFC avrà la risposta definitiva:

http://www.ietf.org/rfc/rfc1738.txt

Non sicuro:

I personaggi possono essere pericolosi per una serie di motivi.Il carattere spaziale non è sicuro perché gli spazi significativi possono scomparire e possono essere introdotti spazi insignificanti quando gli URL vengono trascritti o componibili o sottoposti al trattamento dei programmi di elaborazione delle parole.I personaggi "<" e ">" non sono sicuri perché sono usati come delimitatori attorno agli URL nel testo libero;La citazione mark ("" ") viene utilizzata per delimitare gli URL in alcuni sistemi.Il personaggio "#" non è sicuro e dovrebbe essere sempre codificato perché viene utilizzato nel World Wide Web e in altri sistemi per delimitare un URL da un identificatore di frammento/ancoraggio che potrebbe seguirlo.Il personaggio "%" non è sicuro perché viene utilizzato per codifiche di altri personaggi.Altri personaggi non sono sicuri perché i gateway e altri agenti di trasporto sono noti a volte modificare tali caratteri.Questi personaggi sono "{", "}", "|", "", "^", "~", [", "] e "` ".

Tutti i caratteri non sicuri devono sempre essere codificati all'interno di un URL.Ad esempio, il personaggio "#" deve essere codificato all'interno degli URL anche in sistemi che normalmente non si occupano di frammenti o identificatori di ancoraggio, in modo che se l'URL viene copiato in un altro sistema che li usa, non sarà necessario modificare il Codifica URL.

La risposta è che loro Dovrebbe essere codificato esadecimale, ma conoscendo la legge di Postel, la maggior parte delle cose li accetterà alla lettera.

Per utilizzare la classe HttpClient commons, è necessario esaminare la classe org.apache.commons.httpclient.util.URIUtil, in particolare il metodo encode().Usalo per codificare URI l'URL prima di provare a recuperarlo.

StackOverflow sembra non codificarli:

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

È meglio codificarli tramite URL, poiché chiaramente non sono supportati in tutti i server Web.A volte, anche quando esiste uno standard, non tutti lo seguono.

Secondo il Specifica dell'URL, le parentesi quadre non sono caratteri URL validi.

Ecco i frammenti rilevanti:

I personaggi "National" e "Puntation" non compaiono in nessuna produzione e quindi potrebbero non apparire negli URL.
National {| } | vline | [| ] | | ^ | ~
punteggiatura <| >

Parentesi quadre [ E ] negli URL non sono spesso supportati.

Sostituiscili con %5B E %5D:

  • Utilizzando una riga di comando, si basa l'esempio seguente bash E sed:

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • Utilizzando Java URLEncoder.encode(String s, String enc)

  • Utilizzando PHP rawurlencode() O urlencode()

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    produzione:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    O:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • Usando il tuo linguaggio di programmazione preferito...Estendi questa risposta pubblicando un commento o modificando direttamente questa risposta per aggiungere la funzione che usi dal tuo linguaggio di programmazione ;-)

Per maggiori dettagli, vedere il RFC3986 specificando la sintassi dell'URL.IL Appendice A riguarda %-encoding nella stringa di query (parentesi appartenenti a “gen-delim” essere %-encoded).

Le parentesi quadre sono considerate non sicure, ma la maggior parte dei browser le analizzerà correttamente.Detto questo è meglio sostituire le parentesi quadre con qualche altro carattere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top