[PHP] Pagina opbouw logisch gebruiken icm mod_rewrite

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik loop regelmatig tegen het probleem aan dat de manier waarop je je pagina's indeelt vrij complex kan worden.

Mijn inziens zijn er een paar handige methoden van het opbouwen van een pagina als je gebruik maakt van iets als PHP:

===========================================================================
Voorbeeld 1:

Je roept iedere pagina welke je wilt bezoeken aan en include een header.php en footer.php in de top en bottom van de pagina. Hierdoor ben je vrij om te doen wat je wil in de tussenliggende code, wat dus je pagina.php of pagina2.php zal zijn.

===========================================================================

Voorbeeld 2:

je roept altijd de index.php aan waarin je een klein PHP scriptje hebt staan dat het mogelijk maakt een pagina1.php of pagina2.php te includen en dus weer te geven in je pagina. je krijgt dan dus; index.php?page=pagina1.php of domein.tld/?page=pagina1.php.

===========================================================================

Hoewel versie 2 erg makkelijk is om altijd dezelfde layout te gebruiken en via een qysiwyg editor (DW bijvoorbeeld) makkelijker je layout aan te passen omdat dit eigenlijk altijd uit gaat van de index.php maak je je het in een later stadium met mod_rewrite wel erg lastig.

Ik ben van mening dat mod_rewrite en voorbeeld 1 het makkelijkste te verwerken valt. Je mist de ?page= en kunt direct achter de "paginanaam" (pagina.php) gaan rewriten en niet er al voor.

Uiteraard ligt het aan de applicatie welke je schrijft wat de mees makkelijke methode zal zijn, echter zal er toch een soort van makkelijke standaard moeten zijn.

Mijn vraag is dus, hoe kijken jullie hier tegenaan ? Ik zie bijvoorbeeld bij hyves dat deze nog veel variabelen in de url's gebruiken omdat het simpelweg niet te doen is om hier een beetje een overzichtelijke mod_rewrite voor te schrijven. Echter ga je nooit van een mod_rewrite uit ben ik van mening dat je onlogische code/url's kunt gaan krijgen als bij een site als hyves bijvoorbeeld.

Hoe denkt de gemiddelde PHP-er hierover ?

[ Voor 6% gewijzigd door Verwijderd op 28-11-2008 13:34 ]


Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
optie 2 lijkt me ook niet echt moeilijk. Je zou elke request naar een php pagina naar index.php kunnen omzetten, dus iets van (weet de syntax niet precies)

Match (.*\.php) index.php?page=$1

Maar voor dat probleem met dingen includen en hoe en waar je dat doet lijkt me optie 2 het beste, maar misschien nog beter zou zijn een template systeem waar je wat flexibeler kan werken. En een centrale index.php die alles afvangt is ook geen slecht idee, want ik neem aan dat er meer globale functionaliteiten inzitten zoals authenticatie en databasezooi die je ook maar op 1 plek wil doen en niet in elke pagina wilt aanroepen door een include.

Helaas voor jou ben ik geen PHP'er maar misschien dat het toch wat helpt.

hallo


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Ikzelf ben een fan van routers, dwz onderdelen van een php script die URLs matchen op bepaalde eigenschappen. De pagina site.com/home wordt gerout(ed / ered / ae'd) naar de home controller (indien er van MVC gebruik gemaakt wordt, anders is home.php ook gewoon een optie).

Voor pagina's die parameters horen te ontvangen zijn er een aantal mogelijkheden. De eerste is voor elke pagina een route maken, zoals in onderstaand voorbeeld (in RoR notatie, ik weet niet meer hoe dit in ZF ging):

code:
1
site.com/user/:userid


waar de route gematched wordt op user en de tweede param, userid, wordt nagekeken of het een integer is. Zo kun je voor elke pagina met parameters een route opzetten:

code:
1
2
site.com/boek/:boekid/:paginanr
site.com/fiets/:fietsid/:fietsparam1/:fietsparam2


Een andere mogelijkheid die ook in Zend Framework gebruikt wordt is om alle params gewoon in de notatie paramnaam/param te doen:

code:
1
2
site.com/user/id/10
site.com/boek/boekid/5/paginanr/10


waar bovenstaand voorbeeld redelijk eenvoudig te implementeren is. Je zou eens kunnen zoeken naar routes of router, bijvoorbeeld die in Zend Framework gebruikt wordt hiero

Acties:
  • 0 Henk 'm!

Verwijderd

Tweede optie met mod_rewrite en een paar kekke rewriterules en je zit gebakken. Inderdaad zoals truegrit zegt het gemakkelijkste :)

Overigens gebruik ik een iets andere struktuur met een url handler die gewoon alle urls doorgespeeld krijgt en ze vervolgens naar de juiste klasse doorstuurt. Is wat meer werk om te bakken :)

[ Voor 42% gewijzigd door Verwijderd op 28-11-2008 13:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK, mijn gedachte wordt dus wel gedeeld.

Ik maak momenteel gebruik van een dergelijk script als dit in mijn index:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Check if page has been requested
if (!isset($_REQUEST['page'])) { // Page has not been requested, show default page
$page = 'main.php';

} else { // Page has been requested, validate page exists, show page
$page = $_REQUEST['page'].'.php';

} // End if page has been requested

// Check to see if page exists
if (file_exists($page)) { // Page exists

// Show page
include("./$page");

} else { // Page doesn't exist

echo 'Sorry, the page that you are trying to access does not exist.';
} // End if page exists


}


Dit lijkt een beetje op een php mod_rewrite, maar hier kom ik met methode 2 altijd in de knoei met mod_rewrite. Volgens mij kan dat veel logischer.

Ik moet zeggen dat Voorbeeld 2 mij altijd het meeste aanspreekt, code welke ik hergebruik en waar een header en footer in staat haal ik er direct uit en pas het aan naar mijn zin. Het wiel uitvinden is niet altijd noodzakelijk namelijk.

Echter, de code hierboven lijkt het me wat te bemoeilijken hoewel de code opzich bets handig is :)

Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
Wat is dan het probleem met de code?

hallo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
truegrit schreef op vrijdag 28 november 2008 @ 14:06:
Wat is dan het probleem met de code?
Die code werkt opzich goed !

Ik loop alleen tegen het probleem aan dat waneer ik een /pagina&var=1&var=2 wil gebruiken dit niet kan.

Opzich logisch want dat wil je, testen is alleen wat lastiger op die manier.

Ik ben aan het kijken of je een oneindige mod_rewrite kan maken welke alle variabelen altijd zal vervangen naar /var/var2, dus dat je niet iedere mod_rewrite apart hoeft aan te maken aan de hand van de lengte hiervan.

Acties:
  • 0 Henk 'm!

  • NielsNL
  • Registratie: Januari 2002
  • Laatst online: 08-09 20:14

NielsNL

DigiCow

Ik laat alles met mod_rewrite naar index.php verwijzen, die leest vervolgens de request_uri uit. De eerste 2 zijn altijd map en pagina, de rest wordt door de aangevraagde pagina uitgelezen.
bijv.: http://site.nl/gastenboek/lees/34/edit/
Zal uit de gastenboek module de lees pagina aanroepen, die vervolgens bericht 34 laat zien in een edit form.
Dit lijkt enigzins op de manier die T.net gebruikt. :P

[ Voor 7% gewijzigd door NielsNL op 28-11-2008 15:02 ]

M'n Oma is een site aan het haken.


Acties:
  • 0 Henk 'm!

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Zoals eerder genoemt, je moet niet naar get variabelen kijken..

Als je alles rewrite naar index.php vanaf het begin kun je daarin dmv de $_SERVER['REQUEST_URI'] uit te lezen alles prima verwerken, en je get parameters blijven los daarvan ook nog gewoon werken.

ff simpel, file/dir onderscheiden moet je dan nog doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

    $parts = explode('/', $_SERVER['REQUEST_URI']);
    
    $fileName = array_pop($parts);
    $file = dirname(__FILE__) . '../application/' . implode('/', $parts) . '/' . $file . '.php';
    
    if (file_exists($file)) {
        include $file;
    } else {
        //toon 404
    }


Hier is alle php code buiten je public_html geplaatst in een folder op hetzelfde niveau genaamt application.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat Niels en jij zeggen komt helemaal overeen met mijn idee.

Het is erg makkelijk om een site in mappen in te delen uiteraard en een request_uri voegt hier zeker waarde aan toe moet ik zeggen vanuit het voorbeeld.

Ik denk dat ik hier nog wel een aardig stukje leesvoer over moet kunnen vinden op internet.

Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
auto.php:
PHP:
1
2
3
4
5
6
7
8
9
<?php
include("inc.template.php");
    list ($merk, $model, $motor) = explode("/", substr($_SERVER['PATH_INFO'],1)); 
template_header("Title van de pagina");

echo "inhoud";

template_footer();
?>


htaccess:
code:
1
Options Indexes FollowSymLinks MultiViews All


Op deze manier heb ik dus "domein.tld/auto.php?merk=volkswagen&model=golf&motor=benzine" kunnen aanpassen naar "domein.tld/auto/volkswagen/golf/benzine"

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

MultiViews ftw!

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Verwijderd schreef op vrijdag 28 november 2008 @ 14:01:
OK, mijn gedachte wordt dus wel gedeeld.

Ik maak momenteel gebruik van een dergelijk script als dit in mijn index:

PHP:
1
2
3
4
5
6
7
8
9
10
11
[..]
$page = $_REQUEST['page'].'.php';

} // End if page has been requested

// Check to see if page exists
if (file_exists($page)) { // Page exists

// Show page
include("./$page");
[..]
Je weet hopenlijk dat het controleren of een bestand bestaat het nog niet veilig maakt? Ook het toevoegen van .php maakt het niet veilig. Er kan immers gewoon een string terminator ingegeven worden (\0).
Een manier waarop het wel veilig kan is het doorlopen van webdir en subdirs op valide bestanden en deze in een array zetten (liefst maar meteen met filepath erbij) en dan controleren of de opgevraagde pagina (en het hele pad) in de array voorkomen.
Een andere, wellicht snellere, manier is het gebruiken van een regex om alleen alfanummerieke bestanden toe te laten.

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
krvabo schreef op vrijdag 28 november 2008 @ 18:57:
[...]

Je weet hopenlijk dat het controleren of een bestand bestaat het nog niet veilig maakt? Ook het toevoegen van .php maakt het niet veilig. Er kan immers gewoon een string terminator ingegeven worden (\0).
Een manier waarop het wel veilig kan is het doorlopen van webdir en subdirs op valide bestanden en deze in een array zetten (liefst maar meteen met filepath erbij) en dan controleren of de opgevraagde pagina (en het hele pad) in de array voorkomen.
Een andere, wellicht snellere, manier is het gebruiken van een regex om alleen alfanummerieke bestanden toe te laten.
Ja ik weet dat helemaal !

Het ging meer om het idee en of het functioneel was in de basics.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Stephan4kant schreef op vrijdag 28 november 2008 @ 18:26:
auto.php:
PHP:
1
2
3
4
5
6
7
8
9
<?php
include("inc.template.php");
    list ($merk, $model, $motor) = explode("/", substr($_SERVER['PATH_INFO'],1)); 
template_header("Title van de pagina");

echo "inhoud";

template_footer();
?>


htaccess:
code:
1
Options Indexes FollowSymLinks MultiViews All


Op deze manier heb ik dus "domein.tld/auto.php?merk=volkswagen&model=golf&motor=benzine" kunnen aanpassen naar "domein.tld/auto/volkswagen/golf/benzine"
OK, dit gebruik ik nu ook, werkt erg goed. Dit wel in combinatie met dat eigen script van mij op die eerste .php weg te halen, dit is namelijk makkerlijker dan allemaal mod_rewrite rules te schrijven.

Gebruik jij deze methode dan ook weer in pagina's welke jij include in een andere pagina indien nodig en indien je include gebruikt ? Het lijkt me niet anders mogelijk dan dit gewoon in iedere php file, ookal include je, te gebruiken.

Het code wel een stuk makkelijker !

Acties:
  • 0 Henk 'm!

  • harrald
  • Registratie: September 2005
  • Laatst online: 16-09 08:44
Verwijderd schreef op zaterdag 29 november 2008 @ 02:58:
[...]


OK, dit gebruik ik nu ook, werkt erg goed. Dit wel in combinatie met dat eigen script van mij op die eerste .php weg te halen, dit is namelijk makkerlijker dan allemaal mod_rewrite rules te schrijven.

Gebruik jij deze methode dan ook weer in pagina's welke jij include in een andere pagina indien nodig en indien je include gebruikt ? Het lijkt me niet anders mogelijk dan dit gewoon in iedere php file, ookal include je, te gebruiken.

Het code wel een stuk makkelijker !
je kan het jezelf nog makkelijker te maken door je html van je code te scheiden met een template systeem als smarty.
smarty kent ook includes, dus heb je bijv een index.tpl die een header, menu en footer include. Is echt een verademing tegenover php bestanden met regels html overtussen gefrot.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op vrijdag 28 november 2008 @ 14:01:
PHP:
1
2
3
4
5
6
7
8
9
10
11
// Check to see if page exists
if (file_exists($page)) { // Page exists

// Show page
include("./$page");

} else { // Page doesn't exist

header("HTTP/1.0 404 Not Found");
echo 'Sorry, the page that you are trying to access does not exist.';
} // End if page exists
Alleen mag je, als de page idd niet bestaat, wel een mooie 404 header geven. Dan kan Google en dergelijken er ook wat mee... :)

[ Voor 3% gewijzigd door CH4OS op 29-11-2008 13:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Google negeert alle pagina's die een 404-status geven. Maar voor je bezoekers is het wel zo vriendelijk om een mededeling te tonen waar ze wat mee kunnen, waar mogelijk in de lay-out van de site. Als je werkt met mod rewrite kun je met de opgevraagde URL ook vanuit je database bestaande suggesties doen over wat men wellicht wel zocht.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op zaterdag 29 november 2008 @ 14:04:
Google negeert alle pagina's die een 404-status geven. Maar voor je bezoekers is het wel zo vriendelijk om een mededeling te tonen waar ze wat mee kunnen, waar mogelijk in de lay-out van de site. Als je werkt met mod rewrite kun je met de opgevraagde URL ook vanuit je database bestaande suggesties doen over wat men wellicht wel zocht.
Mja, maar moet je wel een 404 header sturen in je document, anders weet Google niet of hij het moet negeren of niet... ;)
En wat heeft mod rewrite met een database te maken? Die werkt ook heus wel zonder mod rewrite hoor...
Met mod rewrite kan je op een (geavanceerde) manier je lelijke URLs mooier maken en versimpelen, waardoor het meer betekenis krijgt en duidelijker word. Verder doet het niets.

MAW: Ook zonder mod rewrite kan je heus wel suggesties doen naar de bezoeker als die een 404 krijgt bij het opvragen van een pagina.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK, er is een heleboel meer duidelijk laat ik dat voorop stellen.

Ik ben er alleen achter dat je het vrij complex kan maken met mod_rewritre, multiviews, enz.

Mijn plan zoveris:

index.php?page=page.php

met een mod_rewrite omzetten naar

/page

Het probleem dat ik daarna krijg is dat de page.php wel eens een variabele zou kunnen hebben:

/page/var1/var2

Nu zou het ook nog zo kunnen zijn dan in plaats van dat page een page.php is het een directory is waarna de var1 de page.php zou zijn.

Ik ben bang dat het complex gaat worden, Mulitviews zou hierin moeten voorzien maar het lijkt er niet altijd makkelijker op te worden.

Ik wil zoveel mogelijk van mod_rewrite afblijven, maar om de index bij index/page/var weg te halen wanneer ik mulitviews gebruik lijkt het me wel ideal.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben toch van mening dat ik met mod_rewrite aan de gang moet om het allemaal netjes te krijgen.

Zoals ik mijn vorige post aangaf is het lastig wanneer je:

/page/var1/var2

krijgt en met multiviews aan de gang gaat.

Het jammere van mod_rewrite is dat je geen standaard regel aan kunt maken welke te werk gaat als multiviews, dit brengt aardig was extra werk met zich mee.

Tips blijven welkom :)

Ik wil trouwens wel mijn modules in een /moduleX map plaatsen, dus scheelt natuurlijk al wel.

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Verwijderd schreef op dinsdag 09 december 2008 @ 18:01:
Ik ben toch van mening dat ik met mod_rewrite aan de gang moet om het allemaal netjes te krijgen.

Zoals ik mijn vorige post aangaf is het lastig wanneer je:

/page/var1/var2

krijgt en met multiviews aan de gang gaat.

Het jammere van mod_rewrite is dat je geen standaard regel aan kunt maken welke te werk gaat als multiviews, dit brengt aardig was extra werk met zich mee.

Tips blijven welkom :)

Ik wil trouwens wel mijn modules in een /moduleX map plaatsen, dus scheelt natuurlijk al wel.
Als ik je een tip mag geven: Kijk eens naar hoe bestaande frameworks dat doen. Kohana die redirect alles naar index.php, en gebruikt zoals eerder vermeld een router. Je kunt dan met directories werken, reroutes maken en alles. En die gebruiken een hele simpele mod_rewrite.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 09 december 2008 @ 18:01:
Ik ben toch van mening dat ik met mod_rewrite aan de gang moet om het allemaal netjes te krijgen.

Zoals ik mijn vorige post aangaf is het lastig wanneer je:

/page/var1/var2

krijgt en met multiviews aan de gang gaat.

Het jammere van mod_rewrite is dat je geen standaard regel aan kunt maken welke te werk gaat als multiviews, dit brengt aardig was extra werk met zich mee.

[...]
MultiViews en /page/var1/var2 is an-sich niet lastig, alleen jij wilt maar 1 script (index) als startpunt van je webapplicatie en dan ontkom je haast niet aan het gebruik van mod_rewrite. Maar dat hoeft het niet moeilijker te maken.
Zou je behalve een index.php, ook een page.php hebben, dan heb je geen mod_rewrite nodig.

Maar zelfs met mod_rewrite hoeft het niet ingewikkeld te zijn. Iets simpels als dit in .htaccess redirect alles naar /index.php (behalve index.php zelf) en dan kun je ook /page/var1/var2 doen.
code:
1
2
3
4
Options +MultiViews
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index
RewriteRule ^ /index.php


In index.php kun je dan _SERVER[REQUEST_URI] parsen en adhv daarvan je acties bepalen.

Nog een kleine toevoeging, als je met routers e.d. wilt gaan werken, pak dan een al bestaand framework, dan hoef je dat niet zelf op te zetten (tenzij dit een studie project is, want leerzaam is het wel)
Wil je even snel een eenvoudige site opzetten, dan is er imo niks mis met meerdere scripts naast index.php. Met een include('config.php') kom je al een heel eind.

@hieronder:
true, stukje Rewrite-meuk wat ik geschreven heb, is even gauw uit de losse pols ;)

[ Voor 15% gewijzigd door Verwijderd op 10-12-2008 11:11 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kun je makkelijker dit gebruiken:

code:
1
2
3
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]


Die rewrite alles behalve als het een bestaand bestand is zodat je images etc. niet via index.php worden opgehaald.

Ik gebruik ook Zend Framework die alles voor me oplost en evt. kun je custom dingen oplossen met routes zoals YopY al aangeeft.

Verwijderd

Topicstarter
OK, ik ben er redelijk uit.

Ik maak gewoon pagina's aan en gebruik multiviews, dit is echt super handig.

Door mappen te gebuiken verdeel ik mijn modules en ik include gewoon iedere keer de header en footer bij de bestanden welke ik aanroep, worden dus direct nette URL's.

In dat geval kan ik, dat wordt wel wat lastiger, netter URL's aanmaken en de variabelen ook in een page/var1/var2 zetten. Dit is te doen met mod_rewrite en multiviews, het was alleen soms wel wat tegenstrijdig.

If vraag mij alleen af of ik het op andere manier voor elkaar kan krijgen dat bij iedere page.php welke aangeroepen wordt de .php eraf gehaald wordt, oftewel geredirect wordt naar /page/.

Het laatste lijkt me een enige uitdaging :)
Pagina: 1