A) web-dev.dk/includes/articles.asp?category=45670&id=34802
eller
B) web-dev.dk/ASP/brugervenlig_url
Ja, der er vist ikke den store tvivl om hvilken URL af de to ovenstående der er den mest brugervenlige - både når det kommer til at kunne forstå hvad siden, formentlig, handler om samt muligheden for at huske adressen til senere vil mulighed B give langt flere fordele. Og selvfølgelig skal vi heller ikke glemme søgemaskinerne, for dem vil vi selvfølgelig gerne ligge så godt placeret på som muligt, og med en pæn og forståelig URL har vi gjort en smule mere til at vores side bliver lidt bedre forstået og dermed forhåbentlig også bedre placeret.
I modsætning til PHP og ASP.NET har vi i klassisk ASP desværre ikke de store muligheder for uden videre at gå ind og arbejde med URL'en, altså en URL rewrite. I PHP har vi mod_rewrite og i ASP.NET har vi flere muligheder, bla direkte i vores web.config - men i ASP er der ingenting indbygget og de fleste anbefalinger når man spørger rundt omkring går på at man skal benytte en ISAPI rewriter, altså et tredieparts komponent, der, udover formentlig at koste en del, kræver installation på serveren og det har vi meget sjældent adgang til på vores webhoteller.
Den metode jeg vil vise her kræver en custom 404 fejl-side på vores domæne - administrerer vi selv vores IIS eller har vi adgang gennem et kontrolpanel som fx Plesk kan vi selv gå ind foretage de nødvendige ændringer, ellers er vi desværre stadig afhængig af, at webhotellet vil oprette sådan en side for os, men det er dog heldigvis de fleste seriøse steder der vil gøre dette. Før jeg kommer til noget egentlig kode skal det lige siges, at det er nogle forholdsvis simple eksempler jeg kommer med - koden kan variere meget fx afhængig af hvordan databasen er struktureret så der er ikke et egentlig facit, men forhåbentlig kan eksemplerne lede dig på rette spor.
Kendte sidenavne
Første forsøg viser en struktur, hvor vi kun arbejder med statiske sider i en en-til-en mapning relation (altså én redirect for hver url/asp-fil) i vores fejl-side. Her skal vi ind og ændre i vores kode for hver gang vi opretter en ny asp-fil - så denne kode alene opnår man nok ikke alverden med så se det som et eksempel eller som en mulighed i kombination med noget større.
404.asp
<%
'Her fanger vi den string (fx "404;http://domain.dk:80/kontakt"), der bliver sendt med til vores fejlside og som altså indeholder den originale URL. Vi er kun interesseret i en del af den stringen og om den har en rigtig struktur
splitURL = Split(Request.ServerVariables("QUERY_STRING"), ";")
'Her sætter vi en standard side vi redirecter til hvis vi ikke finder en korrekt side
REDIRECT = "sidenfindesikke.asp"
'Først tjekker vi om der er nogle parametre med overhovedet - altså den del efter ;-tegnet
If UBound(splitURL) > 0 Then
'Hvis der er, så tager vi fat i den del vi er interesseret i og deler den op i flere bidder så vi kan arbejde videre med informationerne
splitLINK = Split(splitURL(1), "/")
'Så tjekker vi igennem for at finde den rigtige side at redirecte til
If LCase(splitLINK(3)) = "kontakt" Then
'Vores kontakt-side
REDIRECT = "contact.asp"
ElseIf LCase(splitLINK(3)) = "galleri" Then
'Galleri-siden
REDIRECT = "gallery.asp"
ElseIf LCase(splitLINK(3)) = "omos" Then
'Om os
REDIRECT = "about.asp"
Else
'Hvis ingen af ovenstående matcher lander vi på forsiden
REDIRECT = "default.asp"
End If
End If
'Til sidst redirecter vi uden at URL'en ændrer sig
Server.Transfer("/" & REDIRECT)
%>
Dynamik fra databasen
I dette eksempel forestiller vi os at have en database, der tillader administrator af vores side at oprette hovedsider og undersider i ét niveau under hovedsiderne. Vores menu-struktur kunne fx se således ud og med URL'en angivet parentes;
Velkommen (/velkommen)
Kategorier (/kategorier)
- SEO (/kategorier/seo)
- ASP (/kategorier/asp)
- CSS (/kategorier/css)
Tags (/tags)
- ASP (/tags/asp)
- SEO (/tags/seo)
Kontakt os (/kontakt.asp)
Vores fejl-side kunne så håndtere strukturen således.
404.asp
<%
splitURL = Split(Request.ServerVariables("QUERY_STRING"), ";")
REDIRECT = "sidenfindesikke.asp"
If UBound(splitURL) > 0 Then
SplittetURL = splitURL(1)
'Først vil vi sikre os at vores URL aldrig slutter på / da dette kan forvirre vores udregning når vi skal finde antallet af niveauer
If Right(SplittetURL, 1) = "/" Then
SplittetURL = Left(SplittetURL, Len(SplittetURL) - 1)
End If
splitLINK = Split(SplittetURL, "/")
If LCase(splitLINK(3)) = "kontakt" Then
'Vores kontakt-side
REDIRECT = "contact.asp"
ElseIf UBound(splitLINK) = 3 Then
'Hvis der kun findes ét niveau i vores URL skal vi til vores kategori-side
REDIRECT = "category.asp"
ElseIf UBound(splitLINK) = 4 Then
'Hvis der er to niveauer i vores URL skal vi hen til vores underside
REDIRECT = "subpage.asp"
End If
End If
Server.Transfer("/" & REDIRECT)
%>
For at have så få database-opslag som muligt laver vi ingenting i vores 404-side udover at viderestille og så lader vi den side vi redirecter til foretage den egentlig validering af om det er en valid URL. Man kunne selvfølgelig sagtens foretage en masse validering op imod databasen i 404-siden men i dette eksempel vil det ikke være nødvendigt.
Nu mangler vi så kun en side der kan vise noget indhold.
category.asp
<!--#include file="constants/dbopen.asp" -->
<%
splitURL = Split(Request.ServerVariables("QUERY_STRING"), ";")
'Her sættes en variabel der bestemmer om siden er valid eller ej - som standard er siden ikke valid
SITEERROR = True
If UBound(splitURL) > 0 Then
splitLINK = Split(splitURL(1), "/")
'Vores SQL hvor vi forsøger at hive de nødvendige værdier ud ud fra parameteren i vores URL
SQL = "SELECT id, realname, urlname, description FROM categories WHERE lcase(urlname) = '" & Replace(LCase(splitLINK(3),"'", "''") & "'"
Page = Conn.Execute(SQL)
'Hvis resultatet ikke er tomt gemmer vi værdierne fra databasen i nogle variabler og sætter siden til at være valid
If Not Page.eof Then
SITEERROR = False
ID = Page("id")
REALNAME = Page("realname")
URLNAME = Page("urlname")
DESCRIPTION = Page("description")
End If
Page.Close()
Page = Nothing
End If
'Hvis siden er valid skriver vi vores html
If SITEERROR = False Then
'INDHOLD
End If
%>
<!--#include file="constants/dbclose.asp" -->
<%
'Hvis siden ikke er valid viderestiller vi til en fejlside
If SITEERROR = True Then
Response.Redirect("/404.asp")
End If
%>
Man kan altså opnå nogle ret avancerede strukturerer i sin fejl-side håndtering, herover altså kun vist nogle ret simple ting, men det giver nogle rigtig gode muligheder for at lave en pæn og læsbar URL for både brugere og søgemaskiner.
Som en lille ekstra-bemærkning skal det også lige tilføjes, at når databasen styrer vores URL vil det være en god idé at lave en URL-kolonne i databasen og hvor indholdet er renset for special-tegn som æøå - det kunne fx give resultatet "roedgroed_med_floede" i stedet for "rødgrød med fløde".
b427a51d-e886-414b-972d-b857a5f8d7c6|1|4.0
ASP
asp, seo