Pæn og brugervenlig URL med ASP

25. juni 2008
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".

ASP ,

Kommentarer

Mette
Mette
18-03-2009 01:26:30 #
I mit Plesk er 404-filen en HTML-fil. Hvordan laver jeg en 404-fil i asp? Jeg synes jeg har set hele Plesk igennem og søgt Google tynd, men jeg har stadig ikke fundet ud af det.
Kim Larsen
Kim Larsen
18-03-2009 07:50:08 #
Hvis du har rettighederne til det kan du redigere henvisningen til dit 404 error document - klik på 404 i listen over error documents, skift typen til "url" og ændre location til fx "/404.asp". Herefter vil 404.asp i roden af dit website, altså formentlig mappen "httpdocs", være din fejlside.

Tilføj kommentar


(Viser dit Gravatar icon)

  Country flag

biuquote
  • Kommentar
  • Eksempel
Loading