# Uniform resource locators (URLs) ``` scheme: // user:pass @ host:port /some/path ?a=multi&part=query #fragment http: // foo:P4s$ @ example.com:8080 /also/a/path ?id=1&task=2 #some_ref ``` - If the `//` is absent, then the URI is considered *non-hierarchical*, and the interpretation of all data after the `scheme:` is left up to the handling client. In practice, most clients follow the conventions used for hierarchical URIs. - The `//`, `@`, `#`, and `?` are *separators*. Thus, for example, `http://example.com&foo=bar@167772161/` *actually* points to 10.0.0.1 (in decimal format), with `example.com&foo=bar` being interpreted as a *username* to be used for any prospective authentication! - According to the relevant RFC, the `host` must be either a valid domain name or canonical [[IPv4]] or (bracket enclosed) IPv6 address. However, most parsing libraries will accept decimal, octal, hexadecimal, and even mixed-format IP addresses! - While the query string is typical represented as a series of `&`-delimited key/value pairs, this is actually an arbitrary string whose interpretation is left up to the *server*. - The fragment is also an arbitrary string, but whose interpretation is left up to the *client* (and is *not* supposed to be sent to the server).