1. Dec 24
    Lenkebrudd

    Lenkebrudd

    Dette skriveriet er løst basert på en ALA artikkel jeg leste her om dagen. Den omhandler hvordan du kan lage en feilmeldingsside som er mer informativ både til deg og brukeren som opplever den. ALA forfatteren har valgt å dele inn forskjellige error 404-meldinger i 4 grupper. Jeg derimot velger å sette disse til 3 for enkelhetens skyld.

    • Feil fra brukerens side. Gammelt bokmerke, feilskreven URL.
    • Et brudd på en lenke på din side.
    • Et brudd på en lenke fra en annen side. Enten en søkeside eller en annen side.

      Hovedsakelig ønsker vi som utvikler og eier av siden informasjon dersom det er brudd på en lenke i din side, men også muligens fra andres sider. Dersom det er noen som lenker til siden din (kanskje en annen blogg) så kan du sende en e-post til de og informere om lenkebruddet. Gammelt bokmerke eller feil skrevet URL trenger vi ikke så mye informasjon om.

      For å finne hvor brukeren kom fra kan vi bruke superglobale tabellen _SERVER og hente ut verdien av HTTP_REFERER. Det er viktig å huske at HTTP_REFERER ikke er 100% nøyaktig. Den fungerer bare dersom det blir linket igjennom en a-tag, eller igjennom form-submitt og bilde-kilde. Det fungerer altså ikke dersom det er linket igjennom en e-post, med en redirect, lasting igjennom XML, bokmerke og lignende. Det er også ganske lett å endre innholdet i HTTP_REFERER, så dersom den skal skrives ut må vi ta høyde for XSS. Siden dette ikke er en veldig essensiell funksjon vi skal lage, holder HTTP_REFERER lenge som en pekepinn på hvor brukeren kom i fra. Det er også ingen reell trussel for XSS siden vi ikke trenger å skrive ut verdien eller bruke den i en database eller lignende. HTTP_REFERER kan også ikke eksistere i enkelte tilfeller, derfor er det lurt å ta en isset()-test når man setter verdien.

      Vi setter verdien av HTTP_REFERER slik:

      $referer = null;
      if(isset($_SERVER['HTTP_REFERER'])) {
          $referer = $_SERVER['HTTP_REFERER'];
      }

      1. Gammelt bokmerke eller feilskreven URL

      Dersom $referer er null går vi ut i fra at det går under kategori 1. Vi har ingen stor nytteverdi av å vite dette i noen slags logg eller på e-post, derfor skriver vi bare ut til brukeren at de burde oppdatere bokmerkene sine, eller se etter korrekt side ved å bruke søketjenesten vi har på siden.

      echo "
      <h2>Feilmelding: 404 Fil ikke funnet!</h2>
      \n";
      echo "
       
      Filen du letet etter finnes ikke her. 
       
      ";
      if($referer === null) {
      	echo "Det ser ut til at du bruker et gammelt
      	bokmerke eller har skrevet inn feil URl.
       
      Prøv søkefeltet på siden eller skriv inn
      korrekt URL i adressefeltet i nettleseren din.\n";
      }

      Vi skriver bare ut en enkel feilmelding til brukeren, og logger ikke eller noe i den dur.

      2. Et brudd på en lenke på din side

      Dersom det er et brudd i en lenke på vår side vil vi gjerne vite om det for å kunne korrigere feilen. Derfor kan vi velge å i tillegg til å skrive ut feilmelding så logger vi hendelsen og sender en e-post til administrator om hva som har skjedd.

      Dersom vårt domenenavn er i $referer går vi ut i fra at det er en brudd i en lenke på siden vår. Det er ikke krise dersom noen har tuklet med HTTP_REFERER og lagt inn domenenavnet vårt. Det fører bare til en e-post som vi kan sjekke kjapt selv. Jeg tar en enkel test her for å vise konseptet.

      if (stristr($referer, $_SERVER['SERVER_NAME'])) {
      	sendMailError404("BROKEN_LOCAL", $referer);
      	logError404("BROKEN_LOCAL", $referer);
       
      	echo "Det ser ut til at vi har et lenkebrudd på siden
      	vår. Vi vil med dette se nærmere på saken og håper
      	å få fikset det i løpet av kort tid.
       
              Prøv søkefeltet på denne siden for å finne
      	en annen link til denne siden.\n";
      }

      Her bruker jeg to pseudo-funksjoner til å vise til hvordan en kan gjøre det. sendMailError404 sender rett og slett e-post til administrator som informerer om at det er et lenkebrudd på siden som $referer viser til. Loggen lagrer bare samme informasjon i en txt-fil på root-området eller lignende.

      3. Et brudd på en lenke fra en annen side

      Ved øvrig hendelser, hvor referer er satt men ikke inneholder domenenavnet ditt kan man gå ut i fra at det er en annen side som har en brutt lenke til siden din. Her er det kanskje ikke nødvendig å sende inn en e-post hver gang dette skjer. Ofte kan det være slik at søkesider har gamle sider indeksert og da kan det være litt plagsomt å få flere e-poster hver dag med informasjon om lenkebrudd fra f.eks Google. I dette tilfellet ville jeg bare ha logget hendelsen og med jevne mellomrom sjekket loggen etter noen lenkebrudd fra f.eks bloggrollen min eller andre sider.

      else {
      	logError404("BROKEN_EXTERNAL", $referer);
      	echo "Det ser ut til at vi har et lenkebrudd på en
      	ekstern side. Vi vil med dette se nærmere på saken og håper
      	å få fikset det i løpet av kort tid.
       
              Prøv søkefeltet på denne siden for å finne
      	en annen link til denne siden.\n";
      }

      Vi kan sette en komplett semi-kode på dette for å vise til hvordan det kan gjøres.

      $referer = null;
      if(isset($_SERVER['HTTP_REFERER'])) {
          $referer = $_SERVER['HTTP_REFERER'];
      }
       
      echo "
      <h2>Feilmelding: 404 Fil ikke funnet!</h2>
      \n";
      echo "
       
      Filen du letet etter finnes ikke her.
       
      ";
       
      if($referer === null) {
      	echo "
       
      Det ser ut til at du bruker et gammelt
      	bokmerke eller har skrevet inn feil URl.
       
      Prøv søkefeltet på siden eller skriv inn
      	korrekt URL i adressefeltet i nettleseren din.
       
      \n";
       
      } else if (stristr($referer, $_SERVER['SERVER_NAME'])) {
      	sendMailError404("BROKEN_LOCAL", $referer);
      	logError404("BROKEN_LOCAL", $referer);
       
      	echo "
       
      Det ser ut til at vi har et lenkebrudd på siden
      	vår. Vi vil med dette se nærmere på saken og håper
      	å få fikset det i løpet av kort tid.
       
      Prøv søkefeltet på denne siden for å finne
      	en annen link til denne siden.
       
      \n";
      } else {
      	logError404("BROKEN_EXTERNAL", $referer);
      	echo "
       
      Det ser ut til at vi har et lenkebrudd på en
      	ekstern side. Vi vil med dette se nærmere på saken og håper
      	å få fikset det i løpet av kort tid.
       
      Prøv søkefeltet på denne siden for å finne
      	en annen link til denne siden.
       
      \n";
      }

      Sette en PHP-fil som feilmeldingsdokument

      Når man har laget et PHP-dokument som inneholder koden over må man sette filen man lagrer det som til en Error 404 dokument. Dette gjør man i htaccess filen på følgende måte:

      ErrorDocument 404 /php/404.php

      Nå har vi en error 404 side som er mye mer informativ for både deg og brukeren. På denne måten kan vi også holde oversikt og få hjelp til å finne lenker som er brutt på andres sider som lenker til din side, eller lenker som er brutt på din egen side.

      Som alltid setter jeg pris på tilbakemeldinger.

      Ha en flott jul og et godt nytt år.

      \\ emneord: , , , ,