Qual é a diferença entre um URI, um URL e um URN?

As pessoas falam sobre URLs , URIs e URNs como se fossem coisas diferentes, mas elas são as mesmas a olho nu.

Quais são as diferenças distinguíveis entre eles?

De RFC 3986 :

Um URI pode ser classificado como um localizador, um nome ou ambos. O termo “Uniform Resource Locator” (URL) refere-se ao subconjunto de URIs que, além de identificar um recurso, fornecem um meio de localizar o recurso descrevendo seu mecanismo de access primário (por exemplo, seu “local” de rede). O termo “Uniform Resource Name” (URN) tem sido usado historicamente para se referir a ambos os URIs sob o esquema “urn” [RFC2141], que são obrigados a permanecer globalmente únicos e persistentes mesmo quando o recurso deixa de existir ou fica indisponível, e para qualquer outro URI com as propriedades de um nome.

Então, todas as URLs são URIs (na verdade não são bem assim – veja abaixo), e todas as URNs são URIs – mas URNs e URLs são diferentes, então você não pode dizer que todos os URIs são URLs.

EDIT: eu já havia pensado que todas as URLs são URIs válidos, mas como por comentários:

Não “todas as URLs são URIs”. Depende da interpretação do RFC. Por exemplo, em Java, o analisador de URI não gosta de [ ou ] e isso ocorre porque a especificação diz “não deve” e não “não deve”.

Então isso turvou as águas ainda mais, infelizmente.

Se você ainda não leu a resposta de Roger Pate , aconselho que o faça também.

Identificação e localização de URLs do URI ; no entanto, os localizadores também são identificadores , portanto, cada URL também é um URI, mas há URIs que não são URLs.

Exemplos

  • Roger Pate

Este é o meu nome, que é um identificador. É como um URI, mas não pode ser um URL, pois não informa nada sobre minha localização ou como entrar em contato comigo. Neste caso, também acontece de identificar pelo menos 5 outras pessoas apenas nos EUA.

  • 4914 West Bay Street, Nassau, Bahamas

Este é um localizador, que é um identificador para esse local físico. É como um URL e URI (já que todas as URLs são URIs), e também me identifica indiretamente como “residente de …”. Nesse caso, isso me identifica de maneira única, mas isso mudaria se eu conseguisse um colega de quarto.

Eu digo “como” porque esses exemplos não seguem a syntax requerida.

Confusão popular

Da Wikipedia :

Na computação, um URL (Uniform Resource Locator) é um subconjunto do URI (Uniform Resource Identifier) ​​que especifica onde um recurso identificado está disponível e o mecanismo para recuperá-lo. No uso popular e em muitos documentos técnicos e discussões verbais, muitas vezes é incorretamente usado como sinônimo de URI , … [ênfase minha]

Devido a essa confusão comum, muitos produtos e documentações usam incorretamente um termo em vez do outro, atribuem sua própria distinção ou os usam como sinônimos.

URNs

Meu nome, Roger Pate, poderia ser como um URN (Uniform Resource Name), exceto que são muito mais regulamentados e destinados a ser únicos no espaço e no tempo.

Como atualmente compartilho esse nome com outras pessoas, ele não é globalmente exclusivo e não seria apropriado como URN. No entanto, mesmo que nenhuma outra família usasse esse nome, recebi o nome do meu avô paterno, por isso ainda não seria único ao longo do tempo. E mesmo que não fosse esse o caso, a possibilidade de nomear meus descendentes depois de mim torna isso inadequado como URN.

Os URNs são diferentes dos URLs nessa restrição de exclusividade rígida, embora ambos compartilhem a syntax de URIs.

URI – Identificador Uniforme de Recursos

Os URIs são um padrão para identificar documentos usando uma sequência curta de números, letras e símbolos. Eles são definidos pelo RFC 3986 – Identificador Uniforme de Recursos (URI): Sintaxe Genérica . URLs, URNs e URCs são todos os tipos de URI.

URL – Localizador Uniforme de Recursos

Contém informações sobre como buscar um recurso de sua localização. Por exemplo:

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:user@example.com
  • file:///home/user/file.txt
  • tel:1-888-555-5555
  • http://example.com/resource?foo=bar#fragment
  • /other/link.html (um URL relativo, útil apenas no contexto de outro URL)

As URLs sempre começam com um protocolo ( http ) e geralmente contêm informações como o nome do host da rede ( example.com ) e geralmente um caminho de documento ( /foo/mypage.html ). URLs podem ter parâmetros de consulta e identificadores de fragment.

URN – Nome do Recurso Uniforme

Identifica um recurso por um nome único e persistente, mas não necessariamente informa como localizá-lo na internet. Geralmente começa com o prefixo urn: Por exemplo:

  • https://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn/urn:isbn:0451450523 para identificar um livro pelo seu número ISBN.
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 um identificador global exclusivo
  • urn:publishing:book – Um namespace XML que identifica o documento como um tipo de livro.

Os URNs podem identificar ideias e conceitos. Eles não estão restritos a identificar documentos. Quando um URN representa um documento, ele pode ser traduzido em um URL por um “resolvedor”. O documento pode então ser baixado do URL.

URC – citação de recurso uniforme

Aponta para metadados sobre um documento e não para o próprio documento. Um exemplo de um URC é aquele que aponta para o código-fonte HTML de uma página como: view-source:http://example.com/

URI de dados

Em vez de localizá-lo na internet ou nomeá-lo, os dados podem ser colocados diretamente em um URI. Um exemplo seria data:,Hello%20World .


perguntas frequentes

Eu ouvi dizer que eu não deveria mais dizer URL, por quê?

A especificação W3 para HTML diz que o href de uma tag de âncora pode conter um URI, não apenas um URL. Você deve poder colocar um URN como . Seu navegador, então, resolveria o URL para um URL e baixaria o livro para você.

Algum navegador realmente sabe como buscar documentos pelo URN?

Não que eu saiba, mas o navegador moderno implementa o esquema de URI de dados.

A diferença entre URL e URI tem alguma coisa a ver se é relativa ou absoluta?

Não. Os URLs relativos e absolutos são URLs (e URIs).

A diferença entre URL e URI tem alguma relação com parâmetros de consulta?

Não. Os dois URLs com e sem parâmetros de consulta são URLs (e URIs).

A diferença entre URL e URI tem algo a ver com o fato de ter um identificador de fragment?

Não. Os dois URLs com e sem identificadores de fragments são URLs (e URIs).

A diferença entre URL e URI tem algo a ver com quais caracteres são permitidos?

Não. As URLs são definidas como um subconjunto restrito de URIs. Se um analisador permitir um caractere em um URL, mas não em um URI, haverá um erro no analisador. As especificações são detalhadas sobre quais caracteres são permitidos em quais partes de URLs e URIs. Alguns caracteres podem ser permitidos apenas em algumas partes do URL, mas os caracteres por si só não são uma diferença entre URLs e URIs.

Mas o W3C não diz agora que URLs e URIs são a mesma coisa?

Sim. O W3C percebeu que há muita confusão sobre isso. Eles emitiram um documento de esclarecimento da URI que diz que agora é aceitável usar os termos URL e URI de forma intercambiável (para significar URI). Não é mais útil segmentar estritamente os URIs em tipos diferentes, como URL, URN e URC.

Um URI pode ser um URL e um URN?

A definição de URN é agora mais solta do que o que afirmei acima. A última RFC em URIs diz que qualquer URI agora pode ser uma URN (independentemente de começar com urn: , desde que tenha “as propriedades de um nome”. Ou seja: é globalmente único e persistente mesmo quando o recurso deixa de existir ou fica indisponível. Um exemplo: os URIs usados ​​em tipos de documento HTML, como http://www.w3.org/TR/html4/strict.dtd . Esse URI continuaria a nomear o doctype de transição HTML4 mesmo se a página no site w3.org fosse excluída.


Diagrama URI / URL Venn

Em resumo: um URI identifica, um URL identifica e localiza.

Considere uma edição específica da peça de Romeu e Julieta de Shakespeare , da qual você tem uma cópia digital em sua rede doméstica.

Você pode identificar o texto como urn:isbn:0-486-27557-4 .
Isso seria um URI, mas mais especificamente um URN * porque nomeia o texto .

Você também pode identificar o texto como file://hostname/sharename/RomeoAndJuliet.pdf .
Isso também seria um URI, mas mais especificamente um URL porque localiza o texto .

* Nome do Recurso Uniforme

(Note que meu exemplo é adaptado da Wikipedia )

Estas são algumas respostas muito bem escritas, mas longas. Aqui está a diferença no que diz respeito ao CodeIgniter :

URLhttp://example.com/some/page.html

URI – /some/page.html

Simplificando, a URL é o caminho completo para identificar qualquer recurso em qualquer lugar e pode ter diferentes protocolos como FTP, HTTP, SCP, etc.

O URI é um recurso no domínio atual, portanto, é necessário que menos informações sejam encontradas.

Em todos os casos em que o CodeIgniter usa a palavra URL ou URI, esta é a diferença da qual eles estão falando, embora no grande esquema da web, isso não seja 100% correto.

Um pequeno acréscimo às respostas já postadas, aqui está um diagrama de Venn para resumir a teoria (da bela explicação de Prateek Joshi):

insira a descrição da imagem aqui

E um exemplo (também do site da Prateek):

insira a descrição da imagem aqui

Este é um dos tópicos mais confusos e possivelmente irrelevantes que encontrei como profissional da web.

Pelo que entendi, um URI é uma descrição de algo, seguindo um formato aceito, que pode definir tanto o nome exclusivo (identificação) de algo quanto sua localização.

Existem dois subconjuntos básicos – URLs, que definem a localização (especialmente para um navegador que procura uma página da Web) e URNs, que definem o nome exclusivo de algo.

Eu costumo pensar em URNs como sendo semelhantes aos GUIDs. Eles são simplesmente uma metodologia padronizada para fornecer nomes exclusivos para as coisas. Como no declarativo do namespace que usa o nome de uma empresa – não é como se houvesse um recurso em um servidor em algum lugar para corresponder àquela linha de texto – ele simplesmente identifica algo de forma única.

Eu também tendem a evitar completamente o termo URI e discutir as coisas apenas em termos de URL ou URN, conforme apropriado, porque causa muita confusão. A questão que deveríamos realmente tentar responder pelas pessoas não é tanto a semântica, mas como identificar, ao encontrar os termos, se há ou não alguma diferença prática neles que mudará a abordagem de uma situação de programação. Por exemplo, se alguém me corrige na conversa e diz: “ah, isso não é um URL, é um URI”. Eu sei que eles estão cheios disso. Se alguém disser “estamos usando um URN para definir o recurso”, é mais provável que entendamos que estamos apenas nomeando-o exclusivamente, não localizando-o em um servidor.

Se eu estou fora da base – por favor me avise!

Primeiro de tudo, tire sua mente da confusão e simplifique e você entenderá.

URI => Identificador Uniforme de Recursos Identifica um endereço completo do recurso, isto é, localização, nome ou ambos.

URL => Localizador Uniforme de Recursos Identifica a localização do recurso.

URN => Uniform Resource Name Identifica o nome do recurso

Exemplo

Temos endereço https://www.google.com/folder/page.html onde,

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

URL (Localizador Uniforme de Recursos) => https://www.google.com/

URN (nome de recurso uniforme) => /folder/page.html

URI => (URL + URN) ou somente URL ou apenas URN

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

As URLs são um subconjunto de URIs (que também contêm URNs).

Basicamente, um URI é um identificador geral, em que um URL especifica um local e um URN especifica um nome.

Outro exemplo que eu gosto de usar quando penso em URIs é o atributo xmlns de um documento XML:

  some text  

Nesse caso, com.mycompany.mynode seria um URI que identifica exclusivamente o namespace “myPrefix” para todos os elementos que o utilizam em meu documento XML. Este NÃO é um URL porque é usado apenas para identificar, não para localizar algo em si.

Identificador = Nome + Localização

Cada URL ( U niform R esource L ocator) é um URI ( U niform R esource I dentifier), abstratamente falando, mas cada URI não é um URL. Existe uma outra subcategoria de URI que é URN ( U niform R esource N ame), que é um recurso nomeado mas não especifica como localizá-los, como mailto, news, ISBN é URIs.

insira a descrição da imagem aqui

Sintaxe para URN: [scheme:]scheme-specific-part[#fragment]

Exemplos:
mailto: java-net@java.sun.com
notícias: comp.lang.java
urn: isbn: 096139210x

Sintaxe para URL: [scheme:][//authority][path][?query][#fragment]

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

fonte

Analogia:
Para alcançar uma pessoa: Dirigir (protocolo outros SMS, email, telefone), Endereço (nome do host outro número de telefone, emailid) e nome da pessoa (nome do object com um caminho relativo).

Devido a dificuldades em distinguir claramente entre o URI e o URL, até onde eu me lembro, o W3C não faz mais diferença entre o URI e o URL ( http://www.w3.org/Addressing/ ).

Eles são a mesma coisa . Um URI é uma generalização de um URL. Originalmente, os URIs eram planejados para serem divididos em URLs (endereços) e URNs (nomes), mas havia pouca diferença entre um URL e um URI, e os URIs HTTP eram usados ​​como namespaces, embora eles não localizassem nenhum recurso.

URI e URL

URI, URL, URN

Como a imagem acima indica, existem três componentes distintos em jogo aqui. Geralmente é melhor ir à fonte quando se discute assuntos como estes, então aqui está um trecho de Tim Berners-Lee, et. al. na RFC 3986: Identificador Uniforme de Recursos (URI): Sintaxe Genérica:

Um Uniform Resource Identifier (URI) é uma seqüência compacta de caracteres que identifica um recurso abstrato ou físico.

Um URI pode ser classificado como um localizador, um nome ou ambos. O termo “Uniform Resource Locator” (URL) refere-se ao subconjunto de URIs que, além de identificar um recurso, fornecem um meio de localizar o recurso descrevendo seu mecanismo de access primário (por exemplo, sua “localização” de rede).

O URI é uma espécie de superclass de URLs e URNs. A Wikipedia tem um bom artigo sobre eles com links para o conjunto certo de RFCs.

URL

Uma URL é uma especialização de URI que define o local de rede de um recurso específico. Ao contrário de um URN, o URL define como o recurso pode ser obtido. Usamos URLs todos os dias na forma de http://example.com etc. Mas um URL não precisa ser um URL HTTP, pode ser ftp://example.com etc.

URI

Um URI identifica um recurso por local ou nome ou ambos. Mais frequentemente do que não, a maioria de nós usa URIs que define um local para um recurso. O fato de que uma URI pode identificar resources pelo nome e pelo local gerou muita confusão na minha opinião. Um URI tem duas especializações, conhecidas como URL e URN.

Diferença entre URL e URI

Um URI é um identificador de algum recurso, mas um URL fornece informações específicas para obter esse recurso. Um URI é um URL e, como um comentador apontou, agora é considerado incorreto usar URL ao descrever aplicativos. Geralmente, se o URL descreve o local e o nome de um recurso, o termo a ser usado é URI. Como geralmente é esse o caso que a maioria de nós encontra todos os dias, a URI é o termo correto.

A Wikipedia fornecerá todas as informações de que você precisa aqui. Citando http://en.wikipedia.org/wiki/URI :

Uma URL é uma URI que, além de identificar um recurso, fornece meios de agir ou obter uma representação do recurso descrevendo seu mecanismo de access primário ou “local” de rede.

De acordo com o RFC 3986 , os URIs são compostos pelas seguintes partes:

 scheme://authority/path?query 

O URI descreve o protocolo para acessar um recurso ( caminho ) ou aplicativo ( consulta ) em um servidor ( autoridade ).

Digite a descrição da imagem aqui

Todas as URLs são URIs e todos os URNs são URIs, mas todos os URIs não são URLs.

Por favor, consulte para mais detalhes:

Wikipedia

Um URI identifica um recurso por local ou nome ou ambos. Mais frequentemente do que não, a maioria de nós usa URIs que define um local para um recurso. O fato de que uma URI pode identificar resources pelo nome e pelo local gerou muita confusão na minha opinião. Um URI tem duas especializações, conhecidas como URL e URN.

Uma URL é uma especialização de URI que define o local de rede de um recurso específico. Ao contrário de um URN, o URL define como o recurso pode ser obtido. Usamos URLs todos os dias na forma de http://stackoverflow.com , etc. Mas uma URL não precisa ser uma URL HTTP, pode ser ftp://example.com , etc.

Embora os termos URI e URL sejam estritamente definidos, muitos usam os termos para outras coisas para as quais não estão definidos.

Vamos pegar o Apache por exemplo. Se http://example.com/foo for solicitado a partir de um servidor Apache, você terá as seguintes variables ​​de ambiente definidas:

  • REDIRECT_URL : /foo
  • REQUEST_URI : /foo

Com o mod_rewrite ativado, você também terá estas variables:

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

Esta pode ser a razão para algumas das confusões.

Veja este documento . Especificamente,

uma URL é um tipo de URI que identifica um recurso por meio de uma representação de seu mecanismo de access primário (por exemplo, seu “local” de rede), e não por outros atributos que ele possa ter.

Não é um termo extremamente claro, na verdade.

Depois de ler os posts, encontro alguns comentários muito relevantes. Em suma, a confusão entre as definições de URL e URI é baseada em parte em que definição depende de qual e também do uso informal da palavra URI no desenvolvimento de software.

Por definição, URL é um subconjunto do URI [RFC2396]. URI contém URN e URL. Tanto o URI quanto o URL têm sua própria syntax específica que confere a eles o status de URI ou URL. URN são para identificar exclusivamente um recurso enquanto URL é para localizar um recurso. Observe que um recurso pode ter mais de um URL, mas apenas um único URN. [RFC2611]

Como desenvolvedores e programadores da web, quase sempre nos preocuparemos com URL e, portanto, URI. Agora, um URL é especificamente definido para ter todo o esquema de peças: scheme-specific-part, por exemplo, https://stackoverflow.com/questions . Este é um URL e também é um URI. Agora considere um link relativo incorporado na página, como ../index.html. Isso não é mais uma URL por definição. Ainda é o que é referido como uma “referência URI” [RFC2396].

Eu acredito que quando a palavra URI é usada para se referir a caminhos relativos, “URI-reference” é realmente o que está sendo pensado. Assim, informalmente, os sistemas de software usam o URI para se referir a pathing relativo e URL para o endereço absoluto. Então, nesse sentido, um caminho relativo não é mais um URL, mas ainda URI.

Aqui está minha simplificação:

URN: nome do recurso exclusivo, ou seja, “o que” (por exemplo, urn: issn: 1234-5678). Isto é para ser único .. como em dois documentos diferentes podem ter a mesma urna. Um pouco como “uuid”

URL: “where” para encontrá-lo (por exemplo, https://google.com/pub?issnid=1234-5678 .. ou ftp://somesite.com/doc8.pdf )

URI: pode ser um URN ou um URL. Esta definição difusa é graças ao RFC 3986 produzido pelo W3C e pelo IETF.

A definição de URI mudou ao longo dos anos, por isso faz sentido para a maioria das pessoas ser confundida. No entanto, agora você pode se consolar com o fato de poder se referir a http://somesite.com/something como URL ou URI … e você estará certo de qualquer forma (pelo menos por enquanto, de qualquer maneira .. .)

Eu estava pensando sobre a mesma coisa e eu encontrei isso: http://docs.kohanaphp.com/helpers/url .

Você pode ver um exemplo claro usando o método url::current() . 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:fred@mail.org , 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:0E4FC272-5C02-11D9-B115-000A95B55BC8@stackoverflow.com 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.