Relative URLs, // and ;

Tim Berners-Lee (
Mon, 27 Jan 1997 13:34:41 -0500

Message-Id: <>
Date: Mon, 27 Jan 1997 13:34:41 -0500
To: Daniel LaLiberte <>
From: Tim Berners-Lee <>
Subject: Relative URLs, // and ;

At 11:29 am 27-01-97 -0600, Daniel LaLiberte wrote:
>Did you get this reply?

No -- could be my mail lag.

> > > Absolutely *disagree*.  The // is a device of the relative addressing
> > > originally I intended to be quite general.  The URN scheme should be
> > > onto
> > 
> > >   urn1://authority/nameissuedbyauthority
Dan L:

> > So you are saying that the path scheme should have used path:// also.

Well, no in fact -- see below.  It doesn't need it because it has only
one sort of path element.   URNs *do* need //.   Path doesn't.
> > > so that (a) relative parsing works and (b) people know that the
> > > indicate hierarchy, and (c) people are used to it.
> > 
> > > A fundamental problem with hte URL draft as is it that it suggests
that URL
> > > schemes
> > > must start with FQDNs for relative parsing  to work. Wrong.  It is a
> > > syntactic algorithm.
> > 
> > This is all interesting, but it seems contrary to what I thought was the
> > convention for a couple years, and passed on to other people myself. 
> > Are you just putting your foot down now  .. finally.

I've been out of the loop.  URIs are not supposed to be irrevocably linked
to DNS!
Unfortunately there have been many demands on my time.

> > I'm not clear on how // is a device of the relative addressing, but I
> > read all you might have written on your original general plans.  Could
> > you explain this more, probably to the uri list since others are probably
> > also missing it.

The // is useful in allowing one to jump to scopes in a relative URL.
In the apollo domain file system,  "//" meant "start from LAN and "/" meant
"start from host".
In http:, "//" means start from DNS" and "/" means "start from server".
Hence I would write phone numbers as

	//41/22/767 6111	rather than +41(22)767 6111
	/22/767 6111  rather than (022)767 6111
	767 6111	works either way.

You can see that the phone numbers use the "+" in the same way.
Now Windows NT uses \\ and \ in the same way.  This is a really
common functionality.  It is *NOT* just for DNS.

Generalizing (*always* a good thing), we get

	///mars//canal31/crater 456

It's easy to write the algorithm for relative URIs in the general case of
any number of slashes.
(You can even write one which allows more structure with // occurring in
several places but
I won't go into that as its quite simple)

> > How is ';' involved in relative URLs?

Semicolons were introduced to allow elements to be specified by name rather
position, for spaces which were best seen as matrices rather than trees.
In this case it is only sensible for relative URls which start with ";" to
take a
set of attribute values which are different.  This implies
	1. attributes can only occur once (unless you have a syntax for removing a
	   particular occurrence) and
	2. a missed value is equivalent to an unspecified value
	(so you can remove an occurrence by setting its value to empty)
	3. attributes are unordered

So relative to
or the equivalent

URI	;scale=25000
gives	//;scale=25000;roads=main

and	;roads
gives	//;scale=50000

and	;roads=
gives	//;scale=50000;roads=

and	;rivers=all
gives	//;scale=50000;roads=main;rivers=all

> > Later you said that any hierarchy should use // and /.  But that should
> > be clarified to mean that any hierachy that should take advantage of
> > relative URL support should use // and /.

I'd say any hierarchy should use  /.  To use something else just because for
your current use you don't need relative addressing is silly as it confuses
Yes, it is an arbitrary choice but its made for URIs.

I'd say any hierarchy within which you might want to refer to an intermediate
level needs // for the top.

This includes any hierarchy which is ever going to be extended
upwards (marswards), which is any future proof hierarchy.
For example, suppose we grandfather DNS within something bigger.
Then with old DNS land old URLs work but we can write it as
a part of a new bigger DNS

	///old dns//

for example.

> > Domain names are hierarchical, but they are reversed and use '.' as
> > delimiter.  The path scheme fixes those inconsistencies.

And was a great improvement.  I wasn't certain of the protocol but the
naming scheme is clearly much improved.  But ironically, it is improved
because it doesn't make it clear where the authority/random string
boundary is (allowing it to change). So in fact path:/ does *not* need the //
because there is no "authority" or "server" which has a special place in
the scheme -- it is homogeneous. 

> > dan