URL
adressen som sier hvor en ting er
Hva det er
En URL, kort for Uniform Resource Locator og i dagligtale kalt nettadresse eller bare lenke, er en tekstlinje som både navngir en ressurs og forteller programvare hvordan den skal hentes: hvilken protokoll som skal snakkes, hvilken maskin som skal spørres, og hva den maskinen skal spørres om. Lim den inn i en nettleser, en terminal eller en konfigurasjonsfil, så kan hver av dem handle ut fra den uten mer hjelp.
Oppbygningen ligger fast gjennom den generiske syntaksen, som er lik uansett skjema:
https://shop.example.com:8443/orders/42?view=full#items
scheme https
host shop.example.com
port 8443
path /orders/42
query view=full
fragment items
Skjemaet sier hvordan ressursen nås, her HTTP over TLS. Verten og en valgfri port sier hvor, stien
sier hvilken ressurs på den verten, og spørrestrengen bærer parametere, som regel som par av typen
name=value satt sammen med &. Fragmentet etter # peker inn i resultatet, på en overskrift
eller en posisjon. Det hører til klienten: nettleseren tar det bort før forespørselen sendes, så
serveren får aldri vite hvilken del av siden leseren ble sendt til.
Fordi tegn som /, ?, #, & og = har oppgaver i den strukturen, må hvert av dem som opptrer
som vanlige data, prosentkodes: skrives som % fulgt av to heksadesimale sifre. Et mellomrom blir
%20, et og-tegn %26 og selve prosenttegnet %25. Bokstaver utenfor ASCII reiser på samme måte,
som UTF-8-bytene sine, og det er slik danske eller ukrainske ord i en sti kommer fram.
Er en URL det samme som en URI? Nesten. En URI, Uniform Resource Identifier, er enhver streng i den
syntaksen som identifiserer noe. En URL er den typen som også sier hvordan det kan finnes, mens
urn:isbn:9780000000002 navngir en bok uten å gi noen måte å hente den på. RFC 3986 ber nye
spesifikasjoner om å si URI. WHATWG URL Standard, som nettleserne følger, gikk motsatt vei: den
valgte URL som det ene ordet og satte seg fore å beskrive hva virkelige implementasjoner gjør, med
mål om å erstatte RFC-en. De to er enige om vanlige adresser og skiller lag i kanttilfeller, og det
er verdt å huske når en nettleser og et serverbibliotek tolker den samme rare strengen.
Hvorfor det er viktig
En publisert URL er et løfte. Den havner i bokmerker, søkeindekser, e-poster, trykte brosjyrer, chattelogger og andres sider, og ingen av de kopiene oppdaterer seg selv. Endres adressen senere, brytes hver eneste av dem, med mindre den gamle adressen fortsetter å svare med en omdirigering til den nye.
Det gjør den nyttige beslutningen til en tidlig en: hva adressen bygges av. Alt som sannsynligvis endres, er et dårlig fundament, enten det er en sidetittel, et kategoritre, et produktnavn eller en filendelse som avslører rammeverket som brukes i dag. En kort identifikator varer, og det samme gjør en slug som lagres som data og bare endres med vilje. Det gjør også en plan for hva som skjer når en adresse likevel må flyttes: den gamle blir en permanent omdirigering og ikke en 404.
Den andre beslutningen er hva som holdes utenfor. RFC 9110 sier det rett ut: adresser er laget for å
deles, ikke for å sikres. De skrives til loggene på servere og proxyer, blir liggende i
nettleserhistorikken, kopieres inn i webanalyse og sendes, avhengig av policy, med i
Referer-headeren til det siden laster inn etterpå. Øktidentifikatorer, tokens for tilbakestilling,
API-nøkler og personopplysninger hører hjemme i headere eller i forespørselskropper.
Lengde er et mindre spørsmål. HTTP-spesifikasjonen anbefaler at programvare godtar adresser på minst 8 000 oktetter, noe som er rundhåndet. En spørrestreng som bærer et helt skjema eller et serialisert filter, har likevel en tendens til å treffe en kortere grense et sted langs kjeden før den kommer så langt.
Slik ser det ut i praksis
Arbeidet med dette nettstedet behandler adresser som data som lever lenger enn teksten på siden. Da 495 resultatsider på tre språk ble generert fra en skrivebeskyttet SQLite-eksport, gjaldt beslutningen med størst konsekvenser adressen. Nettstedet utledet tidligere en sides URL fra de første ordene i den engelske formuleringen, så å rette en setning flyttet siden i det stille og brøt alle lenker til den. Adressen skrives nå som data, én rad per adresse per resultat: den første raden er den gjeldende, og hver senere rad er en utfaset adresse som nettstedet sender ut som en omdirigering. Alle adressene nettstedet noen gang har publisert, svarer fortsatt.
Et notat om lommebøker på mobil viser hva som skjer når én URL reiser inne i en annen.
Phantom, Solflare og Backpack åpner en dApp gjennom universelle lenker
som bærer måladressen i sin egen sti og opprinnelsen til siden som ber om det, i en parameter som
heter ref, begge sendt gjennom encodeURIComponent. Et ukodet ? eller & i målet ødelegger
tolkningen, og lommeboken åpner på startskjermen sin i stedet for i nettleserfanen. Et gjettet eget
skjema som backpack:// går det verre med: appen kjenner ikke igjen skjemaet, og brukeren
havner på installasjonssiden.
Adresser tjener også som identitet. Da 963 blokker med strukturerte data ble byttet ut med én lenket graf, ble identifikatorene for organisasjonen, nettstedet og personen utstedt fra nettstedets origin, og listesider publiserer elementene sine bare med URL. Det valget ble målt: å navngi elementene på porteføljeindeksen ville ha betydd 107 fullstendige formuleringer og en komprimert side som var 52 % større. Kontrollen som vokter grafen, slår fast at hver URL den nevner, faktisk ble bygget.
Hvor det går galt
Feil i URL-er er som regel stille. Adressen ser fortsatt riktig ut; den peker bare et annet sted, eller avslører mer enn meningen var.
Koding skjer null ganger eller to. En returadresse som slippes rett inn i en spørrestreng, som i
?next=/cart?item=4&size=m, deles ved den andre &, og serveren ser size=m som en egen
parameter. Å kode en streng som allerede er kodet, gjør %20 om til %2520, og siden får en
bokstavelig %20. Kod hver komponent nøyaktig én gang, i det øyeblikket den settes inn i adressen,
med funksjonen som er laget for komponenter. I JavaScript er det encodeURIComponent; encodeURI
lar ?, & og # være i fred fordi den venter en hel adresse.
En hemmelighet reiser i spørrestrengen. Et token for tilbakestilling av passord eller en
API-nøkkel i URL-en kopieres inn i tilgangslogger, nettleserhistorikk og webanalyse, og med en
romslig referrer-policy sendes det i Referer til hver tredjepart siden laster noe fra. Legg
legitimasjon i en header. Når et token må reise i en lenke, som i en e-post for tilbakestilling,
gjør det til et engangstoken med kort levetid, og sett en Referrer-Policy som holder det hjemme.
Én side svarer på fem adresser. http og https, med og uten www, med og uten skråstrek til
slutt, /About og /about. Skjema og vert skiller per definisjon ikke mellom store og små
bokstaver, mens stien gjør det, med mindre serveren bestemmer noe annet. Søkemotorer deler sidens
anseelse mellom kopiene, cacher lagrer hver av dem for seg, og webanalysen teller dem hver for seg.
Velg én form, omdiriger alle andre former permanent til den, og oppgi den som kanonisk URL.
En relativ lenke løses opp mot feil base. En referanse som img/logo.png erstatter alt etter
den siste skråstreken i den gjeldende stien. På /docs/guide løses den opp til
/docs/img/logo.png; på /docs/guide/ løses den opp til /docs/guide/img/logo.png. Én avsluttende
skråstrek flytter hver relative lenke på siden. Rotrelative lenker, som starter med /, går utenom
problemet.
Logikken avhenger av fragmentet. Omdirigeringer på serveren, tilgangslogger og webanalyse som
leser forespørselen, ser alt fram til # og stopper der. Alt som må nå serveren, hører hjemme i
stien eller i spørrestrengen.
Les mer
- RFC 3986: Uniform Resource Identifier (URI): Generic Syntax — grammatikken, prosentkodingen, relativ oppløsning og normalisering.
- WHATWG URL Standard — tolkningsalgoritmen nettleserne implementerer, steg for steg.
- RFC 3987: Internationalized Resource Identifiers — hvordan adresser skrevet med hvilken som helst skrift blir til prosentkodede byte.
- RFC 8820: URI Design and Ownership — hvorfor eieren av en vert, og ingen andre, bestemmer hvordan stiene der ser ut.
- RFC 9110, section 17.9 — sikkerhetsmerknaden om sensitiv informasjon i adresser.