Søgemaskine venlige URLs med Apache og PHP

Tags:    php
Skrevet af Bruger #890 @ 18.08.2005

Introduktion


Du har sikkert lagt mærke til at mange store sider bruger URLs i retning af www.stortsite.com/section/subsection/article eller lignende. Dette gøres af flere grunde, for det første for at gøre det nemt for søgemaskiner at indeksere siden, i stedet for at bruge sider som section.php?id=2434&articleid=3434 som i mange tilfælde kan give problemer for søgemaskiner. Derudover ved jeg da også godt hvad jeg synes er pænest.


Apacheopsætning


Der er flere måder at gøre det med apache på. Men jeg bruger følgende:
Fold kodeboks ind/udKode 

Denne opsætning skal ligges i filen .htaccess i dit rodbibliotek. Filen har den virkning at alt på dit site der bliver kaldt med /section/something bliver kørt gennem den fil der hedder section.php. Du kan selvfølgelig sætte flere files argumenter op, men dette er blot for at illustrere hvordan det kan gøres. De fleste webhosts der kører med apache vil tillade dette, det kan dog være blokeret i deres konfiguration, men efter hvad jeg har oplevet er dette ganske sjældent.

PHP magic


I min section.php har jeg så følgende kode:
Fold kodeboks ind/udKode 

$parametre['1'] vil så være 'section', mens $parametre['2'] vil være subsection, og så videre og så videre. Dette betyder vi nemt og elegant kan include den side vi gerne vil have med følgende switch statement:
Fold kodeboks ind/udKode 

Dette vil resultere i at alt hvis nogen kalder: www.dinside.dk/section/news vil siden news.php blive inkluderet. Hvorimod www.dinside.dk/section/sports vil inkludere sporsts.php. Hvis det der står efter section/ ikke findes I din switch kode, vil news.php blive inkluderet. Grunden til jeg ikke bare tager $parametre['2'] og sætter .php bag på, er sikkerhed. Dette ville tillade at folk kunne prøve at inkludere filer vi ikke ønsker inkluderet, på vores system. Forestil dig for eksempel at folk kunne inkludere din huskefil med dit password, det ville ikke være særlig heldigt.


Yderligere parametre


En anden smart ting ved at gøre det her, er at du i din news.php kan vide nyheder baseret på $parametre['3'], som jo vil indeholde alt det efter /section/news/ hvis der ellers er tilføjet noget der. Der er selvfølgelig mulighed for at bygge ret lange urls med parametre bagefter, hvis det er noget man ønsker. Jeg bruger det blandt andet i en webshop til at bestemme hvilket produkt folk leder efter, eller hvilken kategori de ønsker at se.


Andre måder at gøre det på


Hvis du har din egen server og har adgang til httpd.conf er der flere elegante måder at gøre det på. For eksempel kan du sætte DocumentRoot til at være en php fil. Dette vil give samme resultat som vores tidligere løsning, bortset fra at alle kald til din side, bliver sendt gennem den fil, uanset om der står /section eller hvad. Hvis du vælger at gøre det på den måde skal du huske at genstarte apache før det virker. Ydermere skal du være opmærksom på at du skal bruge $parametre['1'] til at bestemme hvad for en side der skal inkluderes.


Sikkerhed


I virkeligheden er dette et ganske sikkert system, især med DocumentRoot løsningen, da alt jo vil gå gennem vores php fil. Dette betyder at folk ikke kan sidde og prøve med sjove URLs for at finde skjulte filer. En ting der dog er meget væsentlig at huske på, er at hvis du laver en SQL forespørgsel ud fra en sektion i $parametre, skal du huske at bruge addslashes først, for eksempel sådan her:
Fold kodeboks ind/udKode 

{} rundt om $artikelnummer betyder at php behandler det som en variabel istedet for bare tekst. Hvis du ikke kører det gennem addslashes kan du risikere at folk kan lave det man kalder SQL injection, det vil sige at de kan tilføje noget til dit SQL statement, der kan betyde at din database bliver slettet, eller lignende ting. Derfor, husk altid addslashes. PHP gør det automatisk når du bruger $_GET og $_POST, men desværre ikke når vi laver vores eget system som her.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (24)

User
Bruger #7803 @ 20.08.05 11:25
Flot artikel! :-) men vil nok sige at den ikke lige er for nybegyndere :-)
Der er jo mange nybegyndere som ikke ved hvad switch, explode osv. gør.
mangler lidt mere forklaring i php'en :-) man skal jo også lærer noget af den
User
Bruger #890 @ 20.08.05 23:04
Der kunne godt være noget teori, men det havde jeg ikke lige tænkt så voldsomt meget over må jeg tilstå. Jeg kan kun være enig i det ikke er nybegynder ting, og det var det absolut heller ikke tænkt som, men det er desværre ikke mig der har valgt den skal være Nybegynder, det er admins her på udvikleren.dk
User
Bruger #3143 @ 21.08.05 15:48
Fin artikel, jeg er enig i at det er en god ting med læsevenlige URLs, men funktionaliteten i artiklen gør da ikke URLen mere søgemaskinevenlig.
User
Bruger #890 @ 21.08.05 15:51
Det gør den i og med, at mange søgemaskiner har haft problemer med ? urls, de fleste er ved at komme efter det. Men det er stadig noget man bør være opmærksom på hvis man laver søgemaskine optimering.
User
Bruger #3491 @ 21.08.05 22:19
Du kunne måske også komme ind på hvordan man vha. regular expressions kan lave urls som fx denne:
www.dinside.dk/section/news/2005/08/21

Jeg har selv leget lidt med en metode hvor man bruger apaches mod_rewrite modul.

Der findes lidt om denne metode her:
http://httpd.apache.org/docs/1.3/misc/rewriteguide.html
User
Bruger #890 @ 22.08.05 15:39
mod_rewrite er absolut også en mulighed. Dog synes jeg ikke regexp er relavante når det lavet i php, eftersom du bare kan hente de dele af urlen du vil med $parametre array'et.
User
Bruger #7430 @ 28.08.05 12:44
Jeg anser da mig selv som begynder indenfor PHP, og jeg forstod 99% af artiklen. Kommer til at bruge den :)
User
Bruger #6653 @ 03.09.05 17:01
Jeg er ikke begynder, men jeg forstod heller ikke det hele - til gengæld kunne jeg forstå det hele med dokumentationens hjælp.
User
Bruger #2185 @ 06.10.05 21:44
Jeg har på tidspunkter tænkt over hvordan man mon lavede netop dette trick. Det er ikke noget jeg har haft brug for - endnu. Det er jo i grunden meget simpelt, men også meget simpelt skrevet, hvilket jeg godt kan lide. Regex, implode, explode osv. kan man jo tjekke ud et andet sted. Jeg behøver ikke en kogebog der forklare hvordan mels molekyler er sat sammen, hvis jeg har brug for det, kan jeg læse om det et andet sted. Så kort og godt.
User
Bruger #7379 @ 26.10.05 15:49
Hej...

Nu har jeg læst denne artikel og har tilføjet
<Files section>
ForceType application/x-httpd-php
</Files>
til min .htacces fil
så har jeg skrevet denne koden ind i index.php:
$parametre = explode("/", $_SERVER['REQUEST_URI']);

Men når jeg så kører http://127.0.0.1/index/noget/andet kommer den og siger:
The requested URL /index/noget/andet was not found on this server.

nogle som kan forklare hvorfor?
User
Bruger #7379 @ 26.10.05 16:30
Okay har fået det til at virke, nu har jeg bare et problem med at få fat i mine billeder, har sat documentroot til at være min index.php fil så alt bliver jo kørt igennem den...
User
Bruger #5426 @ 18.11.05 11:09
En glimrende artikel colde, det skal du have. Jeg har somme tider tænkt over, hvordan man laver netop dette, men har dog aldrig haft brug for det. Hvis jeg på et tidspunkt får brug for det, ved jeg da i det mindste hvor man kan finde det nu.
User
Bruger #890 @ 04.12.05 03:56
Michael, i den første ting skulle du bare have skiftet section ud med index i din forcetype. Mht billeder er der mulighed for at sende dem gennem et php script
User
Bruger #7326 @ 15.12.05 18:33
Jeg kan ikke få mine billeder til at virker, det med forcetype forstår jeg ikke rigtigt noget af. og få dem kørt gennem et script ved jeg heller ikke hvordan jeg skal gøre :/
User
Bruger #8772 @ 31.12.05 09:33
Hmm....

Ved ikke helt hvad der er galt med mit scrpt,

Men det her gælder også nå jeg prøver med COPY PASTE, så virker det sjovt nok bare ikke...

The requested URL /projects/links/section/team/ was not found on this server.

//Min htaccess fil
<Files section>
ForceType application/x-httpd-php
</Files>


//Mit script
$module = explode("/", $_SERVER['REQUEST_URI']);

switch ($module['2'])
{
case 'news' : include('modules/module_news.php');
break;

default : include('modules/module_news.php');
}

Nogen der kan se fejlen?
User
Bruger #1330 @ 24.02.06 08:06
Nice artikel Colde,
kunne være man skulle til at omkode sit site så det bruger denne form for urls :)
User
Bruger #4803 @ 12.03.06 12:52
ganske udemærket artikel, ser helt klart frem til at prøve det på min egen webhost :) 5 point herfra i bedste "scenen er din" stil
User
Bruger #8772 @ 05.04.06 11:41
Nogen her der ved hvordan jeg for den til at include på samme måde som man kan gøre det med
section.php?id=2434&articleid=3434

Evt. Se her for at se hvad jeg engtelig mener
www.webhoff.frac.dk
User
Bruger #8772 @ 05.04.06 11:52
Nogen her der ved hvordan jeg for den til at include på samme måde som man kan gøre det med
section.php?id=2434&articleid=3434

Evt. Se her for at se hvad jeg engtelig mener
www.webhoff.frac.dk
User
Bruger #8772 @ 05.04.06 12:06
Nogen her der ved hvordan jeg for den til at include på samme måde som man kan gøre det med
section.php?id=2434&articleid=3434

Evt. Se her for at se hvad jeg engtelig mener
www.webhoff.frac.dk
User
Bruger #3884 @ 05.07.06 20:32
For mig virker det kun hvis man omdøber fx. section.php til section.
User
Bruger #10667 @ 08.12.06 22:45
Jeg er nybegynder til Apache, og har ellers altid kørt på IIS. Er nu skiftet over og jeg forstod alt hvad du skrev. Den er virkelig velskrevet. Du får et stort 5 tal herfra
User
Bruger #9923 @ 08.05.07 23:21
Meget fin artikel, oplere dog samme problem som Krille (At man i filen section.php skal fjerne .php)

Men ellers en meget god artikel som jeg fik meget ud af at læse
User
Bruger #9923 @ 22.01.12 00:16
Hvis andre skulle have behov for det, har jeg rettet .htaccess filen til så den ser således ud:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule $ controller.php

Så bliver alt sendt igennem controller.php som ligger i roden sammen med filen
Du skal være logget ind for at skrive en kommentar.
t