Hoptrasslade rep som bildar en härva, en bild för redirect-kedjor och looparFoto: Erik Mclean via Pexels

Redirect-kedjor och loopar: så hittar och fixar du dem

En omdirigering som går rakt på sin slutadress är snabb och tydlig. Men i takt med att en sajt växer staplas reglerna på varandra, och plötsligt skickar adress A vidare till B, som skickar vidare till C. Varje extra hopp kostar tid för besökaren och späder ut de signaler du vill föra över. I värsta fall pekar reglerna tillbaka på varandra och webbläsaren ger upp med ett felmeddelande. Här går vi igenom hur kedjor och loopar uppstår, hur du hittar dem och hur du rätar ut dem.

Vad en redirect-kedja är

En redirect-kedja uppstår när en adress inte pekar direkt på sitt mål utan på en annan adress som i sin tur pekar vidare. I stället för det raka A till C får du A som skickar till B, som skickar till C. Besökaren och sökroboten måste då följa två hopp i stället för ett för att nå fram. Varje hopp är en egen begäran och ett eget svar i 3xx-familjen, och kedjan kan bli längre än så: A till B till C till D och vidare.

Kedjor är sällan något någon bygger med flit. De byggs upp över tid. En sida flyttas en gång, sedan flyttas målet i sin tur, och den gamla regeln pekar fortfarande på den första nya adressen i stället för att uppdateras till den slutgiltiga. Efter ett par sådana omgångar har du en trappa av omdirigeringar utan att någon planerat det.

Varför varje extra hopp kostar

Det finns två skäl att hålla kedjorna korta. Det första är prestanda. Varje hopp är ett separat anrop till servern: webbläsaren ber om adress A, får tillbaka ett 3xx-svar med en Location-rubrik som pekar på B, frågar efter B, och så vidare tills den når en sida som svarar 200. På en långsam uppkoppling eller mot en server långt borta blir varje extra rundtur en kännbar fördröjning innan något ens börjar visas.

Det andra skälet är att signaler späds ut. En 301 för över det mesta av en sidas upparbetade värde till målet, men en lång kedja gör resan mindre tydlig för sökmotorn. Google har sagt att de följer flera hopp, men de uppmanar samtidigt till att hålla nere antalet och peka direkt på slutmålet. En kedja innebär också fler ställen där något kan gå fel: ett enda trasigt led, till exempel en sida i mitten som börjat svara 404, och hela kedjan bryts. Skillnaden mellan en 301 och en 302 i kedjan spelar roll, se guiden om 301 vs 302 för hur koderna behandlas olika.

Oändliga loopar och ERR_TOO_MANY_REDIRECTS

En loop är specialfallet där kedjan biter sig själv i svansen. A skickar till B, och B skickar tillbaka till A. Webbläsaren följer omdirigeringen fram och tillbaka utan att någonsin nå en sida som svarar 200. För att inte fastna för evigt sätter webbläsarna ett tak för hur många hopp de följer. När taket nås avbryts försöket. I Chrome och andra Chromium-webbläsare visas då ERR_TOO_MANY_REDIRECTS, och i Firefox ett meddelande om att sidan inte omdirigerar korrekt.

Loopar uppstår ofta av en konflikt mellan två regler som var för sig ser rimliga ut. Ett klassiskt fall är när en regel tvingar fram https samtidigt som en proxy eller lastbalanserare framför servern redan terminerat TLS och talar http internt. Servern ser då en http-begäran, svarar med en omdirigering till https, proxyn skickar in den som http igen, och varvet börjar om. Ett annat vanligt fall är att en regel lägger till ett avslutande snedstreck medan en annan tar bort det, så att samma adress studsar mellan med och utan snedstreck.

Så hittar du kedjor och loopar

Det enklaste och mest pålitliga verktyget är curl med flaggorna -sIL. Versalen I hämtar bara svarsrubrikerna, L följer varje omdirigering vidare till nästa, och s dämpar förloppsutskriften. Resultatet blir en lista med ett rubrikblock per hopp, så att du kan läsa hela kedjan i ett svep.

curl -sIL https://example.se/gammal-sida/

Vill du bara se statuskoden och vart varje hopp pekar filtrerar du ut raderna med statuskod och Location:

curl -sIL https://example.se/gammal-sida/ | grep -i "^HTTP\|^location"

Läs uppifrån och ned. Varje HTTP-rad i 3xx-serien följd av en Location-rad är ett hopp. Når du till slut en HTTP-rad som säger 200 har du hittat slutmålet, och antalet 3xx-rader på vägen dit är kedjans längd. Ser du i stället samma två adresser återkomma om och om igen, eller att curl avbryter med ett meddelande om för många omdirigeringar, har du en loop. Mer om att läsa Location-rubriken och tolka koderna finns i guiden om att felsöka och mäta redirects.

Så fixar du dem

Grundregeln är enkel: peka alltid direkt på den slutgiltiga adressen. Hittar du kedjan A till B till C, ändra regeln för A så att den går rakt till C. Den mellanliggande regeln B till C kan finnas kvar för dem som råkar ha kvar den gamla länken till B, men ingen ny besökare ska behöva passera B på vägen från A.

  1. Kartlägg kedjan med curl -sIL och notera varje hopp och dess slutmål.
  2. Skriv om varje regel så att den pekar på slutmålet i stället för på nästa led.
  3. Bryt loopen genom att ta bort eller villkora den regel som skickar tillbaka. Vid http till https bakom en proxy: låt proxyn signalera det ursprungliga protokollet, ofta via rubriken X-Forwarded-Proto, och villkora omdirigeringen på den i stället för på vad servern råkar se internt.
  4. Verifiera igen med curl -sIL tills du ser ett enda hopp följt av 200.

Konkreta regler för Apache, nginx och WordPress finns i guiden om redirect i htaccess, nginx och WordPress.

Vanliga orsaker att hålla utkik efter

Många kedjor och loopar kommer från att flera självständiga omdirigeringar staplas på varandra utan att någon ser helheten. Tre regler som var för sig är rimliga kan tillsammans tvinga fram tre hopp i rad:

  • http till https. All trafik tvingas till den krypterade versionen. Rätt och nödvändigt, men ett hopp.
  • utan www till med www, eller tvärtom. Sajten samlas på en kanonisk värd. Också rätt, men ytterligare ett hopp om det sker i ett separat steg.
  • avslutande snedstreck. En regel som lägger till eller tar bort det avslutande snedstrecket. Ännu ett hopp, och den vanligaste källan till loopar när två lager är oense om strecket.

Var och en för sig är harmlös. Staplade efter varandra blir http://example.se till https://example.se till https://www.example.se till https://www.example.se/, alltså tre hopp innan besökaren ens når sidan. Lösningen är att slå ihop dem till en enda regel som går direkt till den slutgiltiga, kanoniska adressen. Bakgrunden till varför en sajt över huvud taget ska samlas på en adress finns i guiden om vad en 301-redirect är.

Sammanfattning

En redirect-kedja är onödiga mellanhopp på vägen till slutmålet, en loop är en kedja som aldrig når fram. Båda kostar tid och försvagar dina signaler, och loopen stoppar besökaren helt med ett felmeddelande. Hitta dem med curl -sIL, peka varje regel direkt på den slutgiltiga adressen, och slå ihop dina kanoniska regler till en i stället för att stapla dem. Då blir varje begäran ett enda hopp till en sida som svarar 200. Fler genomgångar av omdirigeringar och URL-hantering finns i guidsamlingen.