Qual è la differenza tra un URI, un URL e un URN?

Le persone parlano di URL , URI e URN come se fossero cose diverse, ma sembrano uguali a occhio nudo.

Quali sono le differenze distinguibili tra loro?

Da RFC 3986 :

Un URI può essere ulteriormente classificato come un localizzatore, un nome o entrambi. Il termine “Uniform Resource Locator” (URL) si riferisce al sottoinsieme di URI che, oltre a identificare una risorsa, forniscono un mezzo per localizzare la risorsa descrivendo il suo meccanismo di accesso primario (ad esempio, la sua “posizione” di rete). Il termine “Uniform Resource Name” (URN) è stato usato storicamente per riferirsi a entrambi gli URI sotto lo schema “urna” [RFC2141], che sono tenuti a rimanere globalmente unici e persistenti anche quando la risorsa cessa di esistere o diventa non disponibile, e a qualsiasi altro URI con le proprietà di un nome.

Quindi tutti gli URL sono URI (in realtà non del tutto – vedi sotto), e tutti gli URN sono URI – ma URN e URL sono diversi, quindi non si può dire che tutti gli URI siano URL.

EDIT: avevo già pensato che tutti gli URL fossero URI validi, ma come da commenti:

Non “tutti gli URL sono URI”. Dipende dall’interpretazione della RFC. Ad esempio in Java il parser URI non piace [ o ] e questo perché le specifiche dicono “non dovrebbe” e non “non deve”.

In modo che infanghi ulteriormente le acque, sfortunatamente.

Se non hai già letto la risposta di Roger Pate , ti consiglio di farlo anche tu.

Identificazione dell’URI e localizzazione dell’URL ; tuttavia, i localizzatori sono anche identificatori , quindi ogni URL è anche un URI, ma ci sono URI che non sono URL.

Esempi

  • Roger Pate

Questo è il mio nome, che è un identificatore. È come un URI, ma non può essere un URL, in quanto non ti dice nulla sulla mia posizione o su come contattarmi. In questo caso capita anche di identificare almeno altre 5 persone negli Stati Uniti da soli.

  • 4914 West Bay Street, Nassau, Bahamas

Questo è un localizzatore, che è un identificatore per quella posizione fisica. È come sia un URL che URI (dato che tutti gli URL sono URI) e inoltre mi identifica indirettamente come “residente di …”. In questo caso, mi identifica in modo univoco, ma cambierebbe se ricevessi un compagno di stanza.

Dico “mi piace” perché questi esempi non seguono la syntax richiesta.

Confusione popolare

Da Wikipedia :

Nel calcolo, un URL (Uniform Resource Locator) è un sottoinsieme dell’Uniform Resource Identifier (URI) che specifica dove è disponibile una risorsa identificata e il meccanismo per recuperarla. Nell’uso popolare e in molti documenti tecnici e discussioni verbali è spesso erroneamente usato come sinonimo di URI , … [enfasi mia]

A causa di questa comune confusione, molti prodotti e documentazione utilizzano erroneamente un termine anziché l’altro, assegnano la propria distinzione o li utilizzano come sinonimi.

URN

Il mio nome, Roger Pate, potrebbe essere come un URN (Uniform Resource Name), ad eccezione di quelli che sono molto più regolamentati e intesi per essere unici nello spazio e nel tempo.

Poiché attualmente condivido questo nome con altre persone, non è globalmente unico e non sarebbe appropriato come URN. Tuttavia, anche se nessun’altra famiglia ha usato questo nome, ho preso il nome da mio nonno paterno, quindi non sarebbe stato unico nel tempo. E anche se così non fosse, la possibilità di nominare i miei discendenti dopo di me rende questo non adatto come un URN.

Gli URN sono diversi dagli URL in questo rigido vincolo di unicità, anche se entrambi condividono la syntax degli URI.

URI – Uniform Resource Identifier

Gli URI sono uno standard per identificare i documenti usando una breve stringa di numeri, lettere e simboli. Sono definiti da RFC 3986 – URI (Uniform Resource Identifier): syntax generica . URL, URN e URC sono tutti tipi di URI.

URL – Uniform Resource Locator

Contiene informazioni su come recuperare una risorsa dalla sua posizione. Per esempio:

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:[email protected]
  • file:///home/user/file.txt
  • tel:1-888-555-5555
  • http://example.com/resource?foo=bar#fragment
  • /other/link.html (Un URL relativo, utile solo nel contesto di un altro URL)

Gli URL iniziano sempre con un protocollo ( http ) e di solito contengono informazioni come il nome host di rete ( example.com ) e spesso un percorso del documento ( /foo/mypage.html ). Gli URL possono avere parametri di query e identificatori di frammento.

URN – Nome risorsa uniforms

Identifica una risorsa con un nome univoco e persistente, ma non indica necessariamente come localizzarla su Internet. Di solito inizia con l’ urn: del prefisso urn: Ad esempio:

  • https://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn/urn:isbn:0451450523 per identificare un libro tramite il suo numero ISBN.
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 un identificatore univoco globale
  • urn:publishing:book – Un namespace XML che identifica il documento come un tipo di libro.

Gli URN possono identificare idee e concetti. Non si limitano a identificare i documenti. Quando un URN rappresenta un documento, può essere tradotto in un URL da un “resolver”. Il documento può quindi essere scaricato dall’URL.

URC – Citazione uniforms delle risorse

Indica i metadati relativi a un documento piuttosto che al documento stesso. Un esempio di URC è uno che punta al codice sorgente HTML di una pagina come: view-source:http://example.com/

URI di dati

Piuttosto che localizzarlo su internet, o nominarlo, i dati possono essere inseriti direttamente in un URI. Un esempio potrebbero essere i data:,Hello%20World .


Domande frequenti

Ho sentito che non dovrei più dire URL, perché?

La specifica W3 per HTML dice che l’ href di un tag di ancoraggio può contenere un URI, non solo un URL. Dovresti essere in grado di inserire un URN come . Il tuo browser risolverebbe quindi URN su un URL e scaricherà il libro per te.

Qualche browser in realtà sa come recuperare documenti da URN?

Non che io sappia, ma il moderno browser web implementa lo schema URI di dati.

La differenza tra URL e URI ha qualcosa a che fare con la relativa o assoluta?

No. Sia gli URL relativi sia quelli assoluti sono URL (e URI).

La differenza tra URL e URI ha qualcosa a che fare con i parametri di query?

No. Entrambi gli URL con e senza parametri di query sono URL (e URI).

La differenza tra URL e URI ha qualcosa a che fare con se ha un identificatore di frammento?

No. Entrambi gli URL con e senza identificatori di frammenti sono URL (e URI).

La differenza tra URL e URI ha qualcosa a che fare con quali caratteri sono permessi?

No. Gli URL sono definiti come un sottoinsieme ristretto di URI. Se un parser consente un carattere in un URL ma non in un URI, c’è un bug nel parser. Le specifiche descrivono in dettaglio i caratteri consentiti in quali parti di URL e URI. Alcuni caratteri possono essere consentiti solo in alcune parti dell’URL, ma i caratteri da soli non sono una differenza tra URL e URI.

Ma il W3C non dice ora che URL e URI sono la stessa cosa?

Sì. Il W3C si è reso conto che c’è un sacco di confusione su questo. Hanno emesso un documento di chiarimento URI che dice che ora è OK usare i termini URL e URI in modo intercambiabile (per significare URI). Non è più utile segmentare rigorosamente gli URI in tipi diversi come URL, URN e URC.

Un URI può essere sia un URL che un URN?

La definizione di URN è ora più flessibile di quanto ho affermato sopra. L’ ultima RFC sugli URI dice che qualsiasi URI può ora essere un URN (indipendentemente dal fatto che inizi con urn: purché abbia “le proprietà di un nome”. Cioè: è globalmente unico e persistente anche quando la risorsa cessa di esistere o diventa non disponibile. Un esempio: gli URI utilizzati nei doctype HTML come http://www.w3.org/TR/html4/strict.dtd . L’URI continuerà a nominare il doctype transitorio HTML4 anche se la pagina sul sito w3.org è stata cancellata.


URI / URL Venn Diagram

In breve: un URI identifica, un URL identifica e individua.

Considera un’edizione specifica della commedia di Shakespeare Romeo e Giulietta , di cui hai una copia digitale sulla tua rete domestica.

È ansible identificare il testo come urn:isbn:0-486-27557-4 .
Quello sarebbe un URI, ma più specificamente un URN * perché nomina il testo .

È inoltre ansible identificare il testo come file://hostname/sharename/RomeoAndJuliet.pdf .
Quello sarebbe anche un URI, ma più precisamente un URL perché localizza il testo .

* Nome risorsa uniforms

(Nota che il mio esempio è adattato da Wikipedia )

Queste sono alcune risposte molto ben scritte ma prolifiche. Ecco la differenza per quanto riguarda CodeIgniter :

URL : http://example.com/some/page.html

URI – /some/page.html

In parole povere, l’URL è il modo completo per identificare qualsiasi risorsa ovunque e può avere protocolli diversi come FTP, HTTP, SCP, ecc.

L’URI è una risorsa nel dominio corrente, quindi è necessario trovare meno informazioni.

In ogni istanza che CodeIgniter usa la parola URL o URI questa è la differenza di cui stanno parlando, sebbene nel grande schema del web, non è corretta al 100%.

Una piccola aggiunta alle risposte già pubblicate, ecco un diagramma di Venn per riassumere la teoria (dalla bellissima spiegazione di Prateek Joshi):

inserisci la descrizione dell'immagine qui

E un esempio (anche dal sito web di Prateek):

inserisci la descrizione dell'immagine qui

Questo è uno degli argomenti più confusi e probabilmente irrilevanti che ho incontrato come professionista del web.

A quanto ho capito, un URI è una descrizione di qualcosa, seguendo un formato accettato, che può definire sia il nome univoco (identificazione) di qualcosa che la sua posizione.

Esistono due sottoinsiemi di base: gli URL, che definiscono la posizione (in particolare per un browser che cerca di cercare una pagina Web) e gli URN, che definiscono il nome univoco di qualcosa.

Tendo a pensare agli URN come simili ai GUID. Sono semplicemente una metodologia standardizzata per fornire nomi univoci per le cose. Come nel dichiarativo del namespace che usa il nome di una società – non è come se ci fosse una risorsa seduta su un server da qualche parte per corrispondere a quella riga di testo – identifica semplicemente qualcosa in modo univoco.

Tendo anche a evitare completamente il termine URI e discuto le cose solo in termini di URL o URN, a seconda dei casi, perché causa così tanta confusione. La domanda che dovremmo davvero provare a rispondere alle persone non è tanto la semantica, ma come identificare quando si incontrano i termini o meno c’è qualche differenza pratica in essi che cambierà l’approccio a una situazione di programmazione. Ad esempio, se qualcuno mi corregge in una conversazione e dice “oh, questo non è un URL è un URI” So che ne sono pieni. Se qualcuno dice “stiamo usando un URN per definire la risorsa” sono più propenso a capire che lo stiamo solo nominando in modo univoco, non individuandolo su un server.

Se sono fuori dalla base, per favore fatemelo sapere!

Prima di tutto fai uscire la mente dalla confusione e prendila semplice e capirai.

URI => Uniform Resource Identifier Identifica un indirizzo completo di risorsa, ad esempio posizione, nome o entrambi.

URL => Uniform Resource Locator Identifica la posizione della risorsa.

URN => Nome risorsa uniforms Identifica il nome della risorsa

Esempio

Abbiamo un indirizzo https://www.google.com/folder/page.html dove,

URI (Uniform Resource Identifier) ​​=> https://www.google.com/folder/page.html

URL (Uniform Resource Locator) => https://www.google.com/

URN (Uniform Resource Name) => /folder/page.html

URI => (URL + URN) o solo URL o solo URN

URI => http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

Gli URL sono un sottoinsieme di URI (che contengono anche URN).

Fondamentalmente, un URI è un identificatore generale, in cui un URL specifica una posizione e un URN specifica un nome.

Un altro esempio che mi piace utilizzare quando si pensa agli URI è l’attributo xmlns di un documento XML:

  some text  

In questo caso com.mycompany.mynode sarebbe un URI che identifica in modo univoco lo spazio dei nomi “myPrefix” per tutti gli elementi che lo utilizzano all’interno del mio documento XML. Questo NON è un URL perché è usato solo per identificare, non per localizzare qualcosa di per sé.

Identificatore = Nome + Posizione

Ogni URL ( U niform R esource L ocator) è un URI ( U niform R esource I dentifier), in astratto, ma ogni URI non è un URL. C’è un’altra sottocategoria di URI è URN ( U niform R esource N ame), che è una risorsa denominata ma non specifica come individuarli, come mailto, news, ISBN è URI.

inserisci la descrizione dell'immagine qui

Sintassi per URN: [scheme:]scheme-specific-part[#fragment]

Esempi:
mailto: [email protected]
notizie: comp.lang.java
urn: ISBN: 096139210x

Sintassi per URL: [scheme:][//authority][path][?query][#fragment]

Esempi:
http://java.sun.com/j2se/1.3/ docs / guide / collections / designfaq.html # 28
../../../demo/jfc/SwingSet2/src/SwingSet2.java
File: //host/dir/myfile.txt

fonte

Analogia:
Per raggiungere una persona: guida (protocollo altri SMS, email, telefono), indirizzo (nome host altro numero di telefono, emailid) e nome della persona (nome object con un percorso relativo).

A causa delle difficoltà a distinguere chiaramente tra URI e URL, per quanto ricordo W3C non fa più differenza tra URI e URL ( http://www.w3.org/Addressing/ ).

Sono la stessa cosa Un URI è una generalizzazione di un URL. Originariamente, gli URI erano pianificati per essere suddivisi in URL (indirizzi) e URN (nomi) ma poi c’era poca differenza tra un URL e URI e gli URI http sono stati usati come spazi dei nomi anche se in realtà non localizzavano alcuna risorsa.

URI e URL

URI, URL, URN

Come indica l’immagine sopra, ci sono tre componenti distinti in gioco qui. Di solito è meglio andare alla fonte quando si discutono questioni come queste, quindi ecco un estratto da Tim Berners-Lee, et. al. in RFC 3986: URI (Uniform Resource Identifier): syntax generica:

Un URI (Uniform Resource Identifier) ​​è una sequenza di caratteri compatta che identifica una risorsa astratta o fisica.

Un URI può essere ulteriormente classificato come un localizzatore, un nome o entrambi. Il termine “Uniform Resource Locator” (URL) si riferisce al sottoinsieme di URI che, oltre a identificare una risorsa, forniscono un mezzo per localizzare la risorsa descrivendo il suo meccanismo di accesso primario (ad esempio, la sua “posizione” di rete).

L’URI è una specie di super class di URL e URN. Wikipedia ha un bell’articolo su di loro con link al giusto set di RFC.

URL

Un URL è una specializzazione di URI che definisce il percorso di rete di una risorsa specifica. A differenza di un URN, l’URL definisce come è ansible ottenere la risorsa. Usiamo gli URL ogni giorno sotto forma di http://example.com ecc. Ma un URL non deve essere un URL HTTP, può anche essere ftp://example.com , ecc.

URI

Un URI identifica una risorsa in base alla posizione, a un nome o a entrambi. Più spesso, la maggior parte di noi utilizza URI che definisce una posizione per una risorsa. Il fatto che un URI sia in grado di identificare una risorsa in base al nome e alla posizione ha portato a un sacco di confusione a mio parere. Un URI ha due specializzazioni conosciute come URL e URN.

Differenza tra URL e URI

Un URI è un identificatore per alcune risorse, ma un URL fornisce informazioni specifiche per ottenere tale risorsa. Un URI è un URL e, come indicato da un commentatore, ora viene considerato non corretto utilizzare l’URL quando si descrivono le applicazioni. In generale, se l’URL descrive sia la posizione che il nome di una risorsa, il termine da utilizzare è URI. Poiché questo è generalmente il caso in cui la maggior parte di noi incontra tutti i giorni, l’URI è il termine corretto.

Wikipedia fornirà tutte le informazioni di cui hai bisogno qui. Citando da http://en.wikipedia.org/wiki/URI :

Un URL è un URI che, oltre a identificare una risorsa, fornisce i mezzi per agire o ottenere una rappresentazione della risorsa descrivendo il suo meccanismo di accesso primario o la “posizione” della rete.

Come da RFC 3986 , gli URI sono composti dai seguenti elementi:

 scheme://authority/path?query 

L’URI descrive il protocollo per accedere a una risorsa ( percorso ) o un’applicazione ( query ) su un server ( autorità ).

Inserisci qui la descrizione dell'immagine

Tutti gli URL sono URI e tutti gli URN sono URI, ma tutti gli URI non sono URL.

Si prega di fare riferimento per maggiori dettagli:

Wikipedia

Un URI identifica una risorsa in base alla posizione, a un nome o a entrambi. Più spesso, la maggior parte di noi utilizza URI che definisce una posizione per una risorsa. Il fatto che un URI sia in grado di identificare una risorsa in base al nome e alla posizione ha portato a un sacco di confusione a mio parere. Un URI ha due specializzazioni conosciute come URL e URN.

Un URL è una specializzazione di URI che definisce il percorso di rete di una risorsa specifica. A differenza di un URN, l’URL definisce come è ansible ottenere la risorsa. Usiamo URL ogni giorno sotto forma di http://stackoverflow.com , ecc. Ma un URL non deve essere un URL HTTP, può essere ftp://example.com , ecc.

Sebbene i termini URI e URL siano rigorosamente definiti, molti usano i termini per altre cose rispetto a quelle per cui sono definiti.

Prendiamo ad esempio Apache. Se http://example.com/foo è richiesto da un server Apache, saranno impostate le seguenti variabili di ambiente:

  • REDIRECT_URL : /foo
  • REQUEST_URI : /foo

Con mod_rewrite abilitato, avrai anche queste variabili:

  • REDIRECT_SCRIPT_URL : /foo
  • REDIRECT_SCRIPT_URI : http://example.com/foo
  • SCRIPT_URL : /foo
  • SCRIPT_URI : http://example.com/foo

Questo potrebbe essere il motivo di una parte della confusione.

Vedi questo documento . In particolare,

un URL è un tipo di URI che identifica una risorsa tramite una rappresentazione del suo meccanismo di accesso primario (ad esempio, la sua “posizione” di rete), piuttosto che da alcuni altri attributi che può avere.

Non è un termine estremamente chiaro, davvero.

Dopo aver letto i post, trovo alcuni commenti molto pertinenti. In breve, la confusione tra le definizioni di URL e URI si basa in parte su cui la definizione dipende da quale e anche dall’uso informale della parola URI nello sviluppo del software.

Per definizione l’URL è un sottoinsieme di URI [RFC2396]. L’URI contiene URN e URL. Sia l’URI che l’URL hanno ciascuno la propria syntax specifica che conferisce loro lo stato dell’essere URI o URL. URN serve per identificare in modo univoco una risorsa mentre l’URL serve per localizzare una risorsa. Nota che una risorsa può avere più di un URL ma solo un singolo URN. [RFC2611]

Come sviluppatori e programmatori web ci occuperemo quasi sempre di URL e quindi di URI. Ora un URL è definito in modo specifico per avere tutto lo schema delle parti: parte dello schema specifico, come ad esempio https://stackoverflow.com/questions . Questo è un URL ed è anche un URI. Ora considera un collegamento relativo incorporato nella pagina come ../index.html. Questo non è più un URL per definizione. È ancora quello che viene definito un “riferimento URI” [RFC2396].

Credo che quando la parola URI viene usata per riferirsi a percorsi relativi, “riferimento URI” è in realtà ciò a cui si pensa. Quindi, in modo informale, i sistemi software utilizzano l’URI per fare riferimento al percorso relativo e all’URL per l’indirizzo assoluto. Quindi in questo senso, un percorso relativo non è più un URL ma è ancora URI.

Ecco la mia semplificazione:

URN: nome risorsa univoco, cioè “cosa” (ad es. Urna: issn: 1234-5678). Questo è pensato per essere unico .. come in nessun due documenti diversi può avere la stessa urna. Un po ‘come “uuid”

URL: “dove” per trovarlo (ad es. https://google.com/pub?issnid=1234-5678 .. o ftp://somesite.com/doc8.pdf )

URI: può essere un URN o un URL. Questa definizione fuzzy è grazie a RFC 3986 prodotto da W3C e IETF.

La definizione di URI è cambiata nel corso degli anni, quindi è logico che la maggior parte delle persone venga confusa. Tuttavia, ora puoi fare affidamento sul fatto che puoi fare riferimento a http://somesite.com/something come URL o URI … e avrai comunque ragione (almeno per il momento, comunque .. .)

Mi stavo chiedendo la stessa cosa e ho trovato questo: http://docs.kohanaphp.com/helpers/url .

You can see a clear example using the url::current() method. If you have this URL : http://example.com/kohana/index.php/welcome/home.html?query=string then using url:current() gives you the URI which, according to the documentation, is: welcome/home

URIs came about from the need to identify resources on the Web, and other Internet resources such as electronic mailboxes in a uniform and coherent way. So, one can introduce a new type of widget: URIs to identify widget resources or use tel: URIs to have web links cause telephone calls to be made when invoked.

Some URIs provide information to locate a resource (such as a DNS host name and a path on that machine), while some are used as pure resource names. The URL is reserved for identifiers that are resource locators , including ‘http’ URLs such as http://stackoverflow.com , which identifies the web page at the given path on the host. Another example is ‘mailto’ URLs, such as mailto:[email protected] , which identifies the mailbox at the given address.

URNs are URIs that are used as pure resource names rather than locators. For example, the URI: mid:[email protected] is a URN that identifies the email message containing it in its ‘Message-Id’ field. The URI serves to distinguish that message from any other email message. But it does not itself provide the message’s address in any store.

Easy to explain:

Lets assume the following

URI is your Name

URL is your address with your name in-order to communicate with you.

  • my name is Loyola

    Loyola is URI

  • my address is TN, Chennai 600001.

TN, Chennai 600 001, Loyola is URL

Hope you understand,

Now lets see a precise example

http://www.google.com/fistpage.html

in the above you can communicate with a page called firstpage.html ( URI ) using following http://www.google.com/fistpage.html ( URL ).

Hence URI is subset of URL but not vice-versa.

In order to answer this I’ll lean on an answer I modified to another question . A good example of a URI is how you identify an Amazon S3 resource. Let’s take:

s3://www-example-com/index.html [fig. 1]

which I created as a cached copy of

http://www.example.com/index.html [fig. 2]

in Amazon’s S3-US-West-2 datacenter.

Even if StackOverflow would allow me to hyperlink to the s3:// protocol scheme, it wouldn’t do you any good in locating the resource. Because it Identifies a Resource , fig. 1 is a valid URI. It is also a valid URN, because Amazon requires that the bucket (their term for the authority portion of the URI) be unique across datacenters. It is helpful in locating it, but it does not indicate the datacenter. Therefore it does not work as a URL.

So, how do URI, URL, and URN differ in this case?

NOTE: RFC 3986 defines URIs as scheme://authority/path?query#fragment

A Uniform Resource Identifier (URI) is a string of characters which identifies an Internet Resource.

The most common URI is the Uniform Resource Locator (URL) which identifies an Internet domain address. Another, not so common type of URI is the Universal Resource Name (URN).

I found:


A uniform resource identifier(URI) represents something of a big picture. You can split URIs/ URIs can be classified as locators (uniform resource locators- URL), or as names (uniform resource name-URN), or either both. So basically, a URN functions like a person’s name and the URL depicts that person’s address. So long story short, a URN defines an item’s identity, while the URL provides defines the method for finding it, finally encapsulating these two concepts is the URI

The answer is ambiguous. In Java it is frequently used in this way:

An Uniform Resource Locator (URL) is the term used to identify an Internet resource including the scheme( http, https, ftp, news, etc.). For instance What is the difference between a URI, a URL and a URN?

An Uniform Resource Identifier (URI) is used to identify a single document in the Web Server: For instance /questions/176264/whats-the-difference-between-a-uri-and-a-url

In Java servlets, the URI frequently refers to the document without the web application context.