Spring til indhold
WebIndsigter

Redirects der ikke rådner — ét hop, eller I har ikke flyttet URL'en

I har flyttet URL'en, når det gamle hop lander i ét 301. En kæde er et håb, I kalder redirect.

En 301 er kun SEO, hvis den lander på den rigtige URL i ét hop. Kæder, evige 302'ere og kampagne-URL'er I glemte, er hvordan flytningen rådner efter mandagen.

13 minutters læsning
Stiliseret browservindue med en URL-sti der lander ét sted — en 301 uden kæde, ikke et pilekort I åbnede ved relanceringen og aldrig igen.

Web & SEO

Hvis I søger efter redirect kæde, eller efter 301 vs 302, står I typisk ét sted: en URL, I troede I havde flyttet, lander et andet sted end I sagde — eller den lander tre gange, før den gør. Nogen har en .htaccess fra bureauet, der stadig peger på en side, I slettede i foråret. Nogen satte 302, 'indtil vi er sikre', og har ladet den stå i to år. Nogen har A→B fordi B var den nye slug, og B→C fordi C blev den kanoniske, og ingen slettede det første hop. Nogen sender alt det ukendte til forsiden og kalder det 'bevaret SEO'.

Relancér-indlægget er cutover-planen: 1:1-kort, crawl-kontrol, den mandag I skifter. Fejlsider-indlægget er chrome på 404 og 500. Den her er vanen efter mandagen — inventaret, I faktisk ejer. En ærlig redirect er en sætning: den her gamle URL lever nu der, i ét hop, med den status I mener. Uden den sætning har I en regel, nogen gemte. I har ikke flyttet URL'en.

TL;DR

De vigtigste pointer

  • Ét hop. En 301 til den kanoniske URL. En kæde er et hop, I har glemt at slette.
  • 301 er flytningen. 302 er midlertidigt — Google behandler den som det, I skrev, ikke som det I håbede.
  • En 200 på en død URL er værre end en ærlig 404. Soft-404 er en løgn, crawlen bruger tid på.
  • Inventaret er koden — next.config, _redirects, nginx — ikke et spreadsheet fra relanceringen.
  • Kampagne-URL'er, gamle PDF'er og trailing-slash-dubletter er det, der rådner først.
  • Relancér-indlægget er cutover. Den her er at nægte at lade hoppet rådne, når nogen ændrer slug igen.

Hvorfor det her overhovedet er vigtigt

En redirect er et løfte til to parter: brugeren, der har et bogmærke eller et link i en mail, og crawlen, der har et signal, I gerne vil beholde. Løftet holder, når det gamle hop lander på den rigtige side i ét 301. Det rådner, når I lægger et hop ovenpå et hop, lader en 302 stå, eller svarer 200 på noget, der ikke længere er en side. I tror I har flyttet URL'en. I har flyttet smerten til et sted, I ikke kigger.

Kæder er ikke et kosmetisk problem. Hvert ekstra hop er crawl-budget, I donerer, og et sted en klient eller en bot kan stoppe. En A→B→C, hvor C siden blev 404, er tre chancer for at tabe den, I troede I havde reddet. En loop er værre: I har bedt browseren om at blive. Teams opdager det, når PageSpeed eller et crawl-tool viser 'redirect chain' på en URL, de lovede var kanonisk. De retter den ene. De rører ikke inventaret.

302 vs 301 er det valg, I tager når I er usikre, og glemmer at vende tilbage. En 302 siger midlertidigt. Søgemaskinen må behandle den som det. Hvis jobbet var 'den gamle slug er død, den nye er hjem', er 301 ordet. Hvis jobbet var 'vi A/B-tester en landingside i to uger', er 302 rigtigt — og I skylder en dato, hvor den enten bliver 301 eller forsvinder. En 302 uden ejer er hvordan I har et midlertidigt hop i tre år.

Vi skriver det, fordi 'vi har redirects' er blevet et tjek, I sætter ved go-live og aldrig åbner igen. Et ærligt setup er kedeligt: ét hop pr. gammel URL, 301 når flytningen er rigtig, 404 når siden er død, og en kø I faktisk gennemgår. Uden den vane har I en fil fra bureauet. I har ikke et inventar.

Hvad en redirect faktisk er — og hvad 301 vs 302 ikke er

En redirect er et navngivet løfte: den her URL er ikke længere her; den lever der. Statuskoden er en del af løftet. 301 og 308 siger varigt. 302 og 307 siger midlertidigt. Forskellen på 301/302 og 308/307 er om metoden må skifte — relevant for formularer og API-kald, sjældent for en gammel blogpost. For et marketing-site er sætningen næsten altid: 301, ét hop, til den kanoniske. Resten er undtagelser, I skal kunne forklare.

Det er ikke en canonical-tag. Canonical siger 'af de sider, der findes, er det her den foretrukne'. Redirect siger 'den her URL findes ikke længere som en side'. Bland de to, og I har en URL der 200'er med en canonical til et andet host, mens I også 301'er et tredje sted. Crawlen vælger. I har ikke valgt. Canonical er til dubletter, I stadig serverer. Redirect er til URL'er, I ikke længere vil have inde.

Det er heller ikke et sitemap-entry. Sitemap'et fortæller hvad I gerne vil have crawlet nu. Redirect-inventaret fortæller hvad I skylder de URL'er, I ikke længere vil have crawlet som sig selv. At slette en slug fra sitemap'et og lade den 404 uden at I har besluttet det, er ikke hygiene. At 301'e alt det ukendte til forsiden er det heller ikke: det er en blød 404 med 200-status på destinationen, og crawlen lærer at jeres forside er svaret på alt det døde.

Og det er ikke 'en regel i WordPress-pluginet, I slår til'. Et plugin der auto-301'er ved slug-ændring er et værktøj. Det er ikke ejerskab. Pluginet husker den sidste ændring. Det husker ikke kampagnen fra sidste efterår, PDF'en I flyttede, eller at I nu kører Next.js og den gamle .htaccess ikke længere bliver læst. Inventaret er den fil, I deployer. Alt andet er et håb, I har sat hos en vendor.

Det der typisk går galt, når nogen siger vi har redirects

Den første fejl er at lægge hop på hop. I ændrer slug igen. Pluginet eller next.config tilføjer B→C. A→B bliver stående. Om et år er A→B→C→D, og D er en 404 fordi nogen ryddede 'ubrugte sider'. Relancér-indlægget er at have kortet på cutover-dagen. Her er pligten at slå kæden sammen, hver gang I flytter. Et inventar, I kun åbner ved relaunch, er hvordan redirects rådner.

Den anden fejl er 302'en, I aldrig gjorde permanent. 'Vi er ikke sikre på den nye URL.' Det er ærligt i to uger. Det er en løgn i to år. Søgemaskinen har fået at vide at flytningen er midlertidig. I har fået at vide at I skulle vende tilbage. Ingen gjorde det. Skriv datoen, eller skriv 301. En 302 uden ejer er et midlertidigt hop, I har gjort til arkitektur.

Den tredje fejl er regex, der sluger det, I ikke mente. En catch-all der smider query-strengen væk, så UTM og paginering lander forkert. En trailing-slash-regel der kæder med www-reglen der kæder med http→https, så ét bogmærke er fire hop. Skriv de få, I skylder, eksplicit. En klog stjerne er hvordan I 301'er `/blog/foo` til `/` fordi I mente `/blog/:slug`. Test med de URL'er, I faktisk har ude i mails.

Den fjerde fejl er soft-404 og forside-tragt. En SPA der 200'er alle stier og renderer 'siden findes ikke' i klienten. Et WordPress-tema der viser et søgeresultat med 200. En regel der sender ukendte URL'er til home 'så vi ikke taber linket'. I har fortalt crawlen at det er en side. Den er det ikke. Fejlsider-indlægget er chrome. Her er pligten at lade en død URL være død — 404 eller 410 — eller at flytte den i ét 301 til noget, der faktisk erstatter den.

Inventar i koden vs. spreadsheet fra bureauet

Det ærlige inventar

Hver gammel URL er en linje I deployer. I kan pege på den, teste den, slette den.

  • next.config, _redirects, nginx, eller det plugin I faktisk læser ved deploy — ét sted, ikke tre
  • Ét hop til den kanoniske. Kæder slås sammen, når slug ændres igen
  • 301 når flytningen er rigtig. 404/410 når siden er død. 302 kun med en ejer og en dato
  • Er kedeligt at vedligeholde, og det er hele pointen — det rådner ikke i en mail

Det rådne hop

Et kort fra relanceringen, en .htaccess I ikke længere serverer, tre plugins der alle 301'er.

  • Spreadsheetet blev rigtigt på go-live. Det blev ikke opdateret, da nogen ændrede slug i tirsdags
  • Kæder og 302'ere 'indtil vi er sikre' — uden at nogen blev sikre
  • Alt ukendt til forsiden, så I kan sige at I 'bevarede SEO'
  • Er et håb, I kalder redirect. Crawlen og bogmærket betaler for det

Sådan beslutter I om I overhovedet har et redirect-problem — og hvad I ejer

Uden den her rækkefølge får I endnu en regel, I kalder inventar.

  1. 01

    List de URL'er, I skylder et svar — ikke de URL'er I kan finde på

    Gammelt sitemap. Search Console. Kampagne-links i mails. PDF'er I har delt. De slug-ændringer, I lavede i år. Hvis listen er 'alt der 404'er, send til home', har I ikke et redirect-problem. I har et 'nogen sagde SEO'-problem. Skriv de URL'er, der faktisk har et sted at lande. Resten må 404 ærligt.

  2. 02

    Slå kæderne sammen, før I tilføjer et nyt hop

    Crawl de gamle URL'er. Tæl hop. Hvis A stadig peger på B, og B nu peger på C, så peg A på C og slet B-hoppet hvis B ikke længere er en URL, I vil have inde. Relancér-indlægget er kortet. Her er at nægte at lade kortet gro. Et hop, I ikke kan forklare i én sætning, er et hop I skal slette eller rette.

  3. 03

    Vælg status ud fra jobbet, ikke ud fra vanen

    Siden er erstattet: 301 i ét hop. Siden er midlertidigt nede eller I tester: 302 med en dato. Siden er død, og intet erstatter den: 404 eller 410. I er usikre: det er ikke 302 i to år. Det er at beslutte om der findes en erstatning. En 302 er et løfte om at vende tilbage. Skriv hvem der vender tilbage.

  4. 04

    Læg inventaret der, I faktisk deployer

    Next.js: redirects i config eller på platformen. Cloudflare: i ét sæt regler, ikke tre. WordPress: ét plugin, I kan eksportere, ikke to der kæmper. En .htaccess på en host, I har forladt, er et spøgelse. Test med curl efter deploy — status, Location, antal hop — ikke med 'det virkede i browseren engang'.

  5. 05

    Giv køen et interval, ikke kun en go-live

    Når nogen ændrer en slug, opdateres inventaret samme dag. Når en kampagne slutter, beslutter I om landings-URL'en 301'er til noget levende eller 404'er. Monitoring-indlægget er at se 404-køen. Her er at eje den: et ærligt 404 er færdigt arbejde. En 404 I 'lige skulle have 301'et' i et halvt år er et hop, I aldrig skrev.

“I har flyttet URL'en, når det gamle hop lander i ét 301. En kæde er et håb, I kalder redirect.”

Relancering, kampagner, www og den gamle PDF — samme ord, fire jobs

Relancering er det job, der oftest er rigtigt som et 1:1-kort, og oftest rådner som et spreadsheet. Relancér-indlægget er paritet og cutover. Her er pligten efter: hver ny slug-ændring slår kæden sammen. I flytter ikke 'sitet'. I flytter de URL'er, I stadig skylder. Hvis den nye stack ikke læser den gamle .htaccess, er cutover ikke færdig. I har skiftet host. I har ikke flyttet hoppene.

Kampagne-URL'er er det job, I glemmer, fordi de ikke ligner 'sitet'. /tilbud-forår, /lp/webinar-maj, en UTM-landingside I lovede i et nyhedsbrev. Når kampagnen er død, er URL'en det også — medmindre I 301'er til det, der faktisk erstatter den, eller 404'er med vilje. At lade den 200'e som en tom skabelon er en soft-404. At sende den til forsiden er at fortælle crawlen at forsiden er tilbuddet. Skriv erstatningen, eller skriv 404.

www, https og trailing slash er det job, der oftest bliver fire hop. http://www.example.dk/foo/ → https://www… → https://example.dk/foo/ → https://example.dk/foo. Det er én kanonisk URL, I har gjort til en kæde. Sæt den kanoniske. Lad de tre andre 301'e direkte dertil. Performance-indlægget er LCP. Her er at nægte at lade et bogmærke betale fire RTT'er for et slash, I ikke ville eje som indhold.

Gamle PDF'er, bilag og 'download prisliste' er det job, der oftest 404'er i en mail, nogen sender igen. Hvis filen flyttede, er det et 301 til den nye fil eller til den side, der erstatter den. Hvis filen er død med vilje, er det 404 — ikke et hop til forsiden, så I kan sige at linket 'virker'. Et dokument, I har delt ude i verden, er en URL I skylder et svar. Det er ikke 'bare en fil i /public'.

Hvad I typisk bør gøre i den situation, I står i

Venstre er det, I typisk siger. Højre er det næste skridt, vi typisk anbefaler.

  • Situation

    I har et spreadsheet fra relanceringen og en ny slug-ændring i tirsdags

    Næste skridt

    Flyt inventaret ind i det, I deployer. Slå kæden sammen. Spreadsheetet er et minde

  • Situation

    En 302 har stået 'indtil vi er sikre', og ingen kan huske datoen

    Næste skridt

    Beslut om der findes en erstatning. 301 i ét hop, eller 404. Usikkerhed er ikke en statuskode

  • Situation

    Ukendte URL'er 301'er til forsiden, så I 'ikke taber SEO'

    Næste skridt

    Det er en soft-404. 404 på det døde. 301 kun når destinationen faktisk erstatter siden

  • Situation

    http, www og slash er tre regler, der kæder

    Næste skridt

    Én kanonisk URL. De andre 301'er direkte dertil — ikke hen over hinanden

  • Situation

    I crawler og ser A→B→C, og C er 404

    Næste skridt

    Slet kæden. A skal 404, eller A skal 301'e til noget levende. B er ikke en destination

Tjekliste før I kalder det et redirect-inventar

Hvis I mangler flere af punkterne, er sætningen vi har redirects — setup'et er en fil, I ikke åbner.

  • I kan pege på det sted, I deployer hoppene, og det er ét sted — ikke tre plugins og en gammel host
  • De URL'er, I skylder, lander i ét hop på noget der faktisk erstatter dem — eller de 404'er med vilje
  • 301 er varigt. 302 har en ejer og en dato. Catch-all til forsiden er ikke en strategi
  • Kæder slås sammen, når slug ændres. I crawler stikprøver efter deploy, ikke kun på go-live
  • Kampagne-URL'er og PDF'er er med i køen — ikke kun 'siderne på det nye site'
  • Fejlsider-chrome og relancér-kortet er andre jobs. Den her er vanen efter mandagen

Spørgsmål vi får igen og igen

  • Hvad er forskellen på 301 og 302 for SEO?

    301 og 308 siger at flytningen er varig. 302 og 307 siger midlertidig. Hvis den gamle URL ikke kommer tilbage, er 301 ordet — ét hop til det, der erstatter den. En 302 'indtil vi er sikre' er ærlig i to uger og en løgn i to år: søgemaskinen har fået at vide at hoppet ikke er hjem. Usikkerhed er ikke en statuskode. Beslut om der findes en erstatning, skriv 301, eller skriv 404. Relancér-indlægget er hvornår I skifter. Her er at mene den status, I sender.

  • Hvorfor er en redirect-kæde et problem?

    Fordi hvert ekstra hop er et sted, I kan glemme at opdatere, og crawl-budget I donerer. A→B→C, hvor C siden døde, er tre chancer for at tabe det, I troede I havde flyttet. En loop er værre. Slå kæden sammen: det oprindelige hop skal lande på den kanoniske i ét 301, eller det skal 404'e. At 'det virker i browseren' er ikke inventar. Browseren følger. Crawlen og mail-klienten behøver ikke at gøre det samme antal gange.

  • Må vi sende alle 404'ere til forsiden, så vi bevarer linkene?

    Nej. Det er en soft-404: I fortæller crawlen at forsiden er svaret på en død URL. Linket er ikke bevaret. Det er omdirigeret til noget, der ikke erstatter siden. 301 kun når destinationen faktisk er erstatningen. 404 eller 410 når siden er død. Fejlsider-indlægget er den skærm, et menneske ser. Her er pligten at lade status være sand. En forside-tragt er et håb, I kalder SEO.

  • Hvor skal redirects leve, når vi skifter fra WordPress til Next.js?

    Der, den nye host faktisk læser ved deploy: next.config, platformens redirect-fil, eller kanten — ét sted. Den gamle .htaccess og Yoast-redirects dør med den gamle host, medmindre I eksporterer dem og slår kæderne sammen først. Relancér-indlægget er cutover-kortet. Den her er at nægte at lade kortet blive på den server, I har slukket. Test med curl efter cutover. Et hop, I ikke kan se i den nye config, er et hop I har mistet.

  • Er det her det samme som at relancere uden at miste placeringer?

    Nej. Relancér-indlægget er planen: paritet, 1:1-kort, crawl-kontrol, den mandag I skifter. Den her er vanen efter: slug-ændringen i tirsdags, kampagnen der sluttede, kæden I ikke slog sammen, 302'en I glemte. I kan have et perfekt cutover og stadig rådne inventaret på tre måneder. Monitoring-indlægget er at se 404-køen. Her er at eje hoppet, så køen ikke er fuld af URL'er, I lovede at flytte.

Hvis I har et spreadsheet fra relanceringen og en kæde i crawlen

Lad os skille ét 301 fra et håb, I kalder redirect.

Et inventar I deployer slår en .htaccess, I efterlod på den gamle host.

Hvorfor vi skrev den her

Det er sådan vi tænker — og det er det vi bygger.

Vores indsigter handler om det vi rent faktisk leverer. Hvis det her ramte noget du arbejder med, så er der en konkret service der ligger tæt på.