Bygg en egen 404 - file not found sida
Förord
På pellesoft har ni säkert sett att om du går till en hemsida som kanske har en felaktig länk så kommer du till en som jag gjort. Detta fel kallas från Internet Information 404- file not found. IIS:en ger dig även möjlighet att göra en egen sida som du kan ersätta den befintliga med och det, på ett väldigt enkelt sätt.Innehåll
»»
»
»
Relaterade artiklar
» Bygg en egen 500 - internal server error sidaFörberedelser
I vilken ordning du tar det spelar ingen roll men enklast är om du börjar att konstruera en sida som skall visas när du får ditt 404-fel. Jag tog en standardsida, la dit en ledsam bild samt skrev lite information, exempelvis vem man kontaktar om du upptäcker felet och liknande.
Min sida ser du här 404.asp och denna visas så fort du försöker nå en sida som inte finns på din webbserver. Hur du vill designa din sida, det är upp till dig.
När du har placerat din sida i valfri katalog så se till att om du har referenser och bilder att de får absoluta referenser eftersom sidan kan visas i vilken underkatalog som helst och om du inte har satt referenserna till absoluta så kommer exempelvis inte bilder att visas.
Ställ om webbbservern
Nu när du väl skapat din fil och placerat den på valfritt ställe så är det dags att ställa in webbservern så att då 404-felet uppstår, så laddas din nybyggda sida istället för den som normalt visas.Starta Internet Tjänstehanteraren via start| Inställningar |Kontrollpanelen |Administrationsverktyg |Internet tjänstehanteraren. När du fått igång den så öppnar du trädet så du kommer till din webbserver. Högerklicka på denna och välj egenskaper.
Nu kommer du in till administrationen av din webbserver och här finner du flera flikar med olika inställningar. Fliken "Anpassade felmeddelanden" är den som vi skall använda oss av nu.
Genom att leta fram det alternativ som heter 404 - så kan du därefter dubbelklicka på det alternativet.
Genom att nu ändra sökvägen för 404 till din egna sida så är du faktiskt klar.
Som jag nämnde i början, det spelar ingen roll i vilken ordning du börjar - men det är inte helt rätt. Filen måste finnas som du anger för annars får du ett felmeddelande.
* Korrigering - ange URL, inte FILE
Lite finesser
För att piffa upp detta lite så kan du faktiskt ta hjälp av lite extrafunktioner. Antingen skickar du ett e-mail till dig själv som säger att någon kommit till denna sida. En annan variant är att lagra ner dessa länkar i en tabell som du sedan kan gå igenom för att rätta upp, valet är ditt.För er som sysslat med asp ett tag funderar direkt på att man givetvis använder kommandot HTTP_REFERER. Men i detta fall är det inte smart. Anledningen är att IIS:en faktiskt levererar adressen till dig via URL:en som du kan hämta ut.
Jag tog som exempel att skriva 405.asp istället för 404.asp, vilket gav mig denna URL:
http://www.pellesoft.se/include/404.aspx?404;http://www.pellesoft.se/include/405.aspx
Som du vet så kan man hämta ut en hel URL genom att endast skriva Request.QueryString. Genom att göra detta och sedan leta reda på ; så får vi reda på vilken URL som vi försökte nå fast misslyckades.
Sida = Request.Querystring
SidNamn = Mid(sida, Instr(Sida,";")+1)
För detta returneras då: http://www.pellesoft.se/include/405.aspx. Nu vet vi i alla fall vad sidan hette som inte fanns. Nu kommer nästa fråga. Från vilken sida försökte vi kalla på denna sida om det exempelvis var en länk från en annan sida. Nu kommer HTTP_REFERER till sin rätt.
FromPage = Request.ServerVariables("HTTP_REFERER")
Maila felmeddelandet
Denna är den enda information vi behöver. Dels vilken sida vi försökte nå samt den sida vi försökte nå sidan ifrån. Nu kan vi skriva vårt lilla mail som skickas till dig med felet om du exempelvis använder dig av CDONTS som finns default på din webbserver om det är en IIS. (Se: konfigurera IIS för CDONTS)
Sida = Request.Querystring
SidNamn = Mid(sida, Instr(Sida,";")+1)
FromPage = Request.ServerVariables("HTTP_REFERER")
msg = "En användare försökte nå " & _
SidNamn & _
" via länk från " & _
FromPage & "."
Set CDONTS = CreateObject("CDONTS.NewMail")
CDONTS.From = "pelle@pellesoft.nu"
CDONTS.To = "pelle@pellesoft.nu"
CDONTS.Subject = "Sidan saknas"
CDONTS.Body = msg
CDONTS.Send
Set CDONTS = Nothing
Svårare än så är det inte. Använder du JMail eller någon annan 3:e partskomponent så är det bara att anpassa motsvarande kod för ditt mailobjekt.
Lagra felen i en tabell
Om du sedan vill lagra dessa fel i en tabell så kan du skapa en tabell som exempelvis heter LinkError - i denna skapar du några fält, ett id-fält, missing, frompage, samt datestamp. Med en enkel sql-sats kan du addera en post för varje gång sidan eftersöks men inte finns.Exemplet förutsätter att jag har en connectionsträng som sätts i global.asa och heter Application("DSN").
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open Application("DSN")
' -- SQL / Oracle
Sql = "insert into linkerror " & _
"(missing, frompage, datestamp) " & _
"values('" & sidnamn & "','" & _
fromage & "','" & now & "'"
' -- Access
Sql = "insert into linkerror " & _
"(missing, frompage, datestamp) " & _
"values('" & sidnamn & "','" & _
fromage & "',#" & now & "#"
Con.Execute Sql
Set Con = Nothing
Hoppas detta kan ge er lite ideer att skapa era egna felhanteringssidor nu. Nästa artikel kommer att handla om hur man hanterat 500 - sidan som kräver lite andra funktioner eftersom vi skall presentera vad som är fel i minsta detalj.
Kristoffer Ljungqvist
Men är det inte bättre med att köra det som en url via http://adressen/ och på så sätt hämta 404 filen så vissar den ju inte koden. Eller är jag ute och reser?
Johan Djupmarker
Det verkar vara fel i artikeln, för att källkoden inte ska visas och att man ska få den eftersökta sidan i URL:en måste man ange sidan som en URL istället. Så är det för mig i alla fall.
Kristoffer Ljungqvist
Jo det är ju klart. Men för en asp ändelse ska funka måste du hämta det från servern. Hämtar du inte det från servern ser du bara koden efter som den inte kan läsa av vad koden betyder typ. Men hämtar du sidan via en server så kan den tolka asp koden och du får ett medelande t.ex c:\inetpub\wwwroot\fel\404.asp det funkar inte då vissar den bara asp koden på sidan. men hämtar du det som http://adressen_till_Sidan/fel/404.asp så utför koden asp koden och du ser inte koden hänger du med? På så sätt funkar det men inte på andra sättet.
Kristoffer Ljungqvist
Förstår nu. Men tänkte mer på att du mena att man inte skulle hämta asp sidan via url. Men det var så man ska göra och det är rätt som du säger det.
Jonas Boman
Behöver man ange Response.Status eller görs detta i IIS redan?