webForumDet fria alternativet

Navigering CMS/Sökmotorvänliga URL'er.

PHP

12 svar · 1 222 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej!

Jag har ett egengjort CMS som jag nu ska göra om lite när det gäller URL'er. Man kan ha sidor/artiklar i hur många nivåer som helst:

Id
Parent
Namn
...

Menyn/trädet kan t.ex. se ut såhär:

Hem
  - Nyheter
  - Kalender

Information
  - Kontakt
    - Ring!
    - Skicka E-post
  - Om oss

URL'erna blir då:

/hem/
/hem/nyheter/
/hem/kalender/
/information/
/information/kontakt/
/information/kontakt/ring/
/information/kontakt/skicka-e-post/
/information/omoss/

Nu undrar jag över det lättaste sättet att "fånga upp" vald URL. Jag har kollat på hur det fungerar i t.ex. Wordpress, där alla sidor/anrop går genom index-filen, med hjälp av följande i .htaccess

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

Jag är lite insatt hur resten fungerar i WP, d.v.s. att sidorna sedan hämtar dess ID utifrån preg_match(), men det jag inte vet är varifrån det hämtas. Vad jag kan göra är att skicka ut alla meny-items tillsammans med dess resp. ID som en lång sträng, och sen hämta resp ID med preg_match.
Det går ju även att spara hela "menyträdet" som en array och sedan hämta rätt ID/Key med hjälp av in_array().

$_SERVER['REQUEST_URI'] hittar ju det som finns i adressfältet, är det "bra" och "säkert" att använda sig av den servervariabeln för att hämta rätt artikel/sida, eller bör man göra på något annat sätt?

Men den stora frågan är ju - vilket sätt är bäst/snabbast?
Jag bör ju ha hela trädet som någon typ av variabel/array i en fil och läsa in filen vid varje anrop, snarare än att hämta hela trädet från databasen vid varje anrop, eller hur?

Så, hur hade ni löst det?

Tack!

Medlem sedan juni 2009920 inlägg
#2

Du gör precis som du skriver och använder dig av servervariabeln :)
Om du lagrar sidorna ungefär som i WordPress (där hela sökvägen till sidan sparas i databasen) så kan du ju använda den variabeln rakt av för att söka efter sidan. Det du kanske ska tänka på dock, är att sanera variabeln innan den går in i en SQL-fråga, men jag utgår från att du inte använder gamla och förlegade mysql_connect så då sköts mycket av det automatiskt ;)

Bäst prestandamössigt? Tja, det är ju så man gör :-)
Det du pratar om benämns ofta som URL segments. Och en snabb Googling kommer visa dig att sättet man implementerar det på i PHP är genom just den servervariabeln. Ofta så brukar man köra explode på den med snedstreck som delimiter, men det beror ju på hur sidorna är organiserade i databasen.

Förresten, hur kommer det sig att du utvecklade ett CMS själv? :-)

Medlem sedan feb. 20034 441 inlägg
#3

Ok.. Tack! Men är det verkligen ett (bra) alternativ att hämta rätt sida direkt från databasen, istället för att cache/spara alla sidor inkl. dess id'n? "Trädet" hämtas ju rekursivt, nu är det visserligen inte så stora träd, men ändå..? :)

CMS-biten är bara en liten, liten del av ett helt system med massa annat, därför har jag utvecklat det på egen hand.

Medlem sedan juni 2009920 inlägg
#4

Det är nog en god idé att cacha innehållet, särskilt om den nu hämtar innehållet rekursivt :-)

Medlem sedan feb. 20034 441 inlägg
#5

Jo, men på vilket sätt? Som en array som jag sparar i en fil jag skriver till, eller som en sträng för att sedan ta ut URL'en med regex?

Medlem sedan juni 2012581 inlägg
#6

Jag sitter just nu och försöker mig på just detta. Problemet är att min htaccess inte verkar fungera alls. Jag får bara ett 404-meddelande om jag lägger till /något/här längst bak i URLen.

Medlem sedan feb. 20034 441 inlägg
#7

Då gör du förmodligen fel.. Kolla mitt första inlägg, det räcker för att det ska fungera.

Medlem sedan juni 2012581 inlägg
#8

MickeA.com skrev:

Då gör du förmodligen fel.. Kolla mitt första inlägg, det räcker för att det ska fungera.

Haha, you don't say!? Jag gör något kalasfel, jag kan bara inte komma på vad. Jag kopierade din .htaccess rakt av. Min gissning är att jag har konfigurerat Apache på något okonventionellt sätt.

Går jag till /index.php fungerar det så klart, men /blahblahblah/blah fungerar inte. Den går inte till /index.php oavsett vilken URL jag skriver.

Medlem sedan juni 20031 837 inlägg
#9

Har du aktiverat mod_rewrite in din apache konfiguration?

Medlem sedan juni 2012581 inlägg
#10

The_Hulk skrev:

Har du aktiverat mod_rewrite in din apache konfiguration?

Det var mer genant än så. Jag hade glömt RewriteEngine On.

Medlem sedan juni 20031 837 inlägg
#11

prplxr skrev:

Det var mer genant än så. Jag hade glömt RewriteEngine On.

Bra att det löste sig. Glöm inte att markera tråden som löst =)

Medlem sedan juni 200032 967 inlägg
#12

The_Hulk skrev:

Bra att det löste sig. Glöm inte att markera tråden som löst =)

Fast nu är det ju inte hans tråd - prplxr var bara lite av en trådtjuv. ;-)

Medlem sedan juni 20031 837 inlägg
#13

@nders skrev:

Fast nu är det ju inte hans tråd - prplxr var bara lite av en trådtjuv. ;-)

Oj, det tänkte jag inte på.
Farligt med tjuvar :D

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)