Seo url

  • Beste leden,


    Voor whmcs heb ik nu een klein scriptje gemaakt waardoor hij een aantal knowledgebase files (3 laatste uitleest en op de homepagina zet)
    Alleen op de een of andere manier pakt hij de seo vriendelijke urls niet


    De link moet zijn: https://starohosting.nl/knowledgebase/01/test.html
    Hij doet: https://starohosting.nl/01/test.html


    Hierbij het script:


    Als het niet aan het script ligt waar lig het dan aan? ik gebruik htacces voor seo vriendelijke urls:


    PHP
    # Knowledgebase
    RewriteRule ^knowledgebase/([0-9]+)/[a-z0-9_-]+\.html$ ./knowledgebase.php?action=displayarticle&id=$1 [L,NC]
    RewriteRule ^knowledgebase/([0-9]+)/([^/]*)$ ./knowledgebase.php?action=displaycat&catid=$1 [L,NC]
    RewriteRule ^knowledgebase$ ./knowledgebase.php [L,NC]


    Hopelijk kunnen jullie mij helpen?

  • Ik denk dat het je gelukt is ondertussen, want als ik https://starohosting.nl/knowledgebase/01/test.html bezoek, krijg ik netjes de pagina te zien?
    De andere link werkt niet.


    Als ik zo je htaccess bestand lees, lijkt deze in orde te zijn.
    Enkel de eerste regel wordt toegepast in dit geval.


    In je php code zie ik wel nergens waar je je "id" in de query zet om enkel dat artikel te lezen.
    Je haalt dus gewoon alle artikels op in dit geval, met een limit erop.
    Ik weet ook niet zeker of 01 in de url standaard werkt, dat het niet gewoon 1 moet zijn.

  • Nee nog niet gelukt..
    Als je naar beneden scroll zie je test staan in de footer (deze wordt uit het bestand in het starttopic uitgelezen en daar geplaatst) en als je dan op de link test klikt verwijs hij niet door naar de juiste link..
    Hoe kan dit?


    Het heeft denk ik met deze rij te maken:

    PHP
    if ( $seoUrls ) {
      $kbUrl = $kbarticle['id'] . "/" . seoFriendly($kbarticle['title']) . ".html";
  • Nu gebruik je andere code dan in je begin topic?
    En beide zijn fout.


    PHP
    $kbUrl = knowledgebase/$kbarticle['id'] . "/" . seoFriendly($kbarticle['title']) . ".html";


    Moet waarschijnlijk zijn:

    PHP
    $kbUrl = "knowledgebase/".$kbarticle['id'] . "/" . seoFriendly($kbarticle['title']) . ".html";


    Maar ik zie in je php code ook nergens een where, waarmee je de id van de url gebruikt om de resultaten te tonen die hij moet tonen.

  • Jouw functie is nog niet helemaal waterdicht, om URLS etc. op de juiste manier te verbouwen gebruik ik de volgende code... ik hoop dat je er wat aan hebt :thumbup:


  • Aangezien het topic nog niet gelocked is, mag ik hier op reageren? ^^


    @M.Beers, maar welke functie gebruik je dan om een URL te bouwen (om deze geschikt te maken om af te drukken)?


    Hopelijk niet sanitize_url()? De omschrijving van deze functie is mij niet helemaal duidelijk? Deze functie is waarschijnlijk bedoeld om je input ($string) geschikt te maken om opgenomen te worden in een URL, bijvoorbeeld als querystring-parameter of -parameter-waarde. Maar dan lijkt het mij vreemd dat je die standaard lowercase maakt, omdat deze mogelijk case-sensitive behandeld wordt.


    Wat je dus hierboven "hebt" zijn een aantal bouwstenen om een URL te maken, maar wat je wellicht nog liever wilt hebben is een soort van link-functie: een eenduidige manier om een URL te bouwen binnen je applicatie.


    Wat Starohosting en K.Rens hierboven doen is in principe niet verkeerd, maar het is toch in zekere zin hardcoding van je interne links. Hier is niets mis mee... totdat je besluit dat je een pagina anders wilt noemen of wilt verplaatsen binnen je website-structuur. Het is veel flexibeler om een (aparte) site-structuur op te zetten en hier aan te refereren via één functie.


    Kijk, het hangt natuurlijk in sterk af van hoe je hele applicatie is gestructureerd maar hoe groter je systeem wordt, hoe meer (potentieel) werk je creëert als je iets wilt wijzigen. Als je een aantal standalone PHP scripts hebt is zo'n generieke oplossing een beetje overkill.


    Maar laten we deze train-of-thought eens verder verkennen.


    Dan .htaccess. Wat je hier in feite doet is het maken van een mapping van externe URL naar een interne URL / intern script via RewriteRules. Dit is in zekere zin ook hardcoding. Ik weet niet hoe het bij jullie zit maar ik had vroeger altijd ruzie met RewriteRules. Daarnaast, als dat ding over tijd groeit wordt het een nachtmerrie om te onderhouden en als je een foutje maakt krijg je een Internal Server Error. Dat wil je ook niet op een productie-omgeving.


    Hoe vet zou het zijn om het beheer van deze mappings te verplaatsen naar een structuur binnen je applicatie, geen gekloot meer met RewriteRules en je .htaccess bestand is en blijft klein en overzichtelijk. Vervolgens maak je één link-functie die van deze site-structuur gebruik maakt. Voordeel daarvan is dat je geen interne links meer hardcode en het gevolg hiervan is dat je code herbruikbaar(der) wordt.


    Dan de link-functie zelf. Hoe zou deze er uit moeten zien? En hoe bouw ik vervolgens een URL, en wat zijn de regels voor het opstellen van deze URL? Dit hangt weer sterk samen met je site-structuur.


    Stel je hebt bijvoorbeeld een nieuws-onderdeel, te bereiken via /news. Hier zou je een overzicht kunnen tonen van de meest recente nieuwsitems (via interne links via je link-functie). De nieuws-pagina is een "node" in je sitestrucuur. Aan deze node koppel je een pagina-type "news" die op zijn beurt weer gekoppeld is aan een News class (die dynamisch via een autoloader wordt geladen) die uitgevoerd wordt als je de /news pagina aanroept. Deze (relatieve) URL (news) sla je op als "slug" in je sitestructuur. En wanneer je een pagina binnen deze sitestructuur aanroept dan rijg je de slugs van deze nodes aan elkaar, gescheiden door een forward slash. Het eerste argument van je linkfunctie is dus bijvoorbeeld een sitestructuur-id of een (intern) pad (maar dat is eigenlijk wederom hardcoding). En voor het tweede argument zou je een array van querystring-argumenten kunnen gebruiken.


    Nu kun je in je code een (interne) link-functie aanroepen die een URL construeert op grond van je site-structuur, die je vrij kunt aanpassen. Als je code enkel gebruik maakt van deze link-functie verandert deze mee als je een pagina verplaatst of van naam wijzigt - en hier hoef je verder niets voor te doen!


    Dan resten er nog twee dingen: hoe maak ik de slugs en hoe verzorg ik vervolgens de afhandeling van de aanroep van een link?


    Hierboven wordt al een voorbeeld gegeven van hoe je je slugs kunt "bakken": je stript alles wat niet voldoet aan een bepaald patroon. Een alternatief wat misschien de moeite waard is om te bekijken is een variant die probeert exotische karakters om te zetten naar standaard letters uit het alfabet. Ik heb hiervoor als inspiratie de volgende site gebruikt: The perfect PHP clean url generator.


    En dan nog de routing. Kort door de bocht stuur je alle requests via je .htaccess door naar /index.php die het verzoek verder afhandelt.


    Als je het netjes wilt doen dan kost dit redelijk wat werk, maar dit is, als dit alles achter de rug is, de moeite waard.


    Een ander voordeel van de gebruikmaking van een aparte sitestructuur is dat je hier ook een rechtenbeheer in onder kunt brengen.


    Wat je dan uiteindelijk gebouwd hebt is een website... om websites mee te bouwen :). Of je hebt in ieder geval een goed begin gemaakt.


    Waar je nog wel aan moet denken is het volgende: als je een link afdrukt in een HTML-document moet je deze escapen om deze te ontdoen van enige speciale betekenis binnen deze context (net zoals je binnen de context van een url onderdelen escaped met urlencode()). Hier kun je het beste htmlspecialchars voor gebruiken.


    Een voorbeeld van een aanroep van een linkfunctie die ik gebruik:

    PHP
    <?php
    // eerste parameter is het pad, false wil zeggen: het script zelf
    $action = $this->link(false, array(
        $this->cfg->actionVariable => 'addNodeProcess',
        $this->cfg->redirVariable => true,
    ));
    ?><form action="<?php echo $this->escape($action) ?>" method="post" accept-charset="UTF-8">


    En de output:

    Code
    <form action="http://mijn.website.com/pad/naar/pagina?action=addNodeProcess&amp;redir=1" method="post" accept-charset="UTF-8">


    De linkfunctie zet alles ook om naar absolute URL's, inclusief domein. Daarnaast zijn de namen van de action- en redirect-parameters ook vrij instelbaar via configuratie.


    Om je maar een idee te geven :).

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!