login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP] .htaccess

Offline Craain - 23/06/2016 15:35 (laatste wijziging 23/06/2016 15:38)
Avatar van CraainNieuw lid Als ik goed begrijp kan ik met het bestand '.htaccess' de url adres wat netter uitzien, ik heb veel verschillende codes geprobeerd, echter zonder resultaat.

ik heb een url adres staan:
mijnwebsite.nl/mapnaam/index.php?pagina=artikel/kook

bestand .htaccess:
  1. RewriteEngine On
  2. ...... hier kom ik niet uit......


Wat ik heb geprobeerd is om "index.php?" weg te halen uit bovenstaande url adres.

Bij voorbaat dank,

5 antwoorden

Gesponsorde links
Offline Thomas - 23/06/2016 16:00 (laatste wijziging 23/06/2016 16:01)
Avatar van Thomas Moderator Iets meer moeite, maar een elegantere oplossing is (wat mij betreft) om alles door te sturen naar index.php. Vervolgens zal je de REQUEST_URI moeten ontleden om te bepalen welke pagina een gebruiker wenste op te vragen. En als dit niets oplevert serveer je een 404 Not Found pagina.

Het "probleem" van constructies met ?pagina=xyz is dat je de querystring-variabele "pagina" reserveert en effectief de $_GET namespace vervuilt. Ook is niet intuitief duidelijk welke variabelen er in $_GET bestaan, dit zou direct evident moeten zijn op grond van de URL.

In andere varianten introduceer je tig RewriteRules (en mogelijk RewriteConditions) om de externe URL om te kneden naar een interne variant. Dit is (naar mijn mening) een inflexibele opzet die ook vrij foutgevoelig is. Maak je een fout in je .htaccess bestand krijg je een gezellige 500 Internal Server Error. Daarnaast wordt zo'n opzet na verloop van tijd een gigantische brei.

Dus, houd het simpel en redirect alles naar index.php.

Dit, ook wel "routing" genaamd, is wel een redelijk geavanceerd onderwerp in PHP. Ik weet niet hoe ver jouw kennis verder reikt, maar op deze plek (.htaccess en index.php) zul je redelijk wat werk moeten verzetten om de rest van je applicatie naar behoren te laten werken.

Om een voorbeeld te geven van zo'n universele .htaccess:
  1. # Enable rewriting.
  2. RewriteEngine on
  3.  
  4. # Optional: do not allow perusal of directories.
  5. Options -Indexes
  6.  
  7. # Optional: explicitly enable per-directory rewrites in the .htaccess context.
  8. Options +FollowSymLinks
  9.  
  10. # Required when not in the webroot. Always use a trailing slash.
  11. RewriteBase /
  12.  
  13. # To be able to access existing directories and files (standalone scripts).
  14. RewriteCond %{REQUEST_FILENAME} !-d
  15. RewriteCond %{REQUEST_FILENAME} !-f
  16.  
  17. # Redirect everything else to index.php.
  18. # Add QSA to ensure that querystring variables are registered as such.
  19. RewriteRule . index.php [L,QSA]

Hiermee ben je dus nog zeker niet klaar. Je zult in index.php een rekensom moeten uitvoeren die de REQUEST_URI (of liever gezegd $_SERVER['REQUEST_URI']) verder ontleedt.

Nobody said it would be easy ;).
Offline Craain - 23/06/2016 16:19 (laatste wijziging 23/06/2016 16:19)
Avatar van Craain Nieuw lid Dit is helemaal nieuw voor mij en ook zeer ingewikkeld, ik dacht dat het zo gebeurd was... Over .htaccess heb ik niet zo veel kennis van...

Mijn index.php ziet er zo uit:

  1. if(empty($_GET['pagina']))
  2. include("paginas/home.php");
  3. elseif(strstr($_GET['pagina'], "index") || strstr($_GET['pagina'], ".."))
  4. include("paginas/fout.php");
  5. elseif(file_exists("paginas/".$_GET['pagina'].".php"))
  6. include("paginas/".$_GET['pagina'].".php");
  7. elseif(file_exists("paginas/".$_GET['pagina'].""))
  8. include("paginas/".$_GET['pagina']."");
  9. else
  10. include("paginas/fout.php");
Offline Thomas - 23/06/2016 17:25
Avatar van Thomas Moderator Hm, dat valt nog wel om te schrijven zodat je deze info uit je REQUEST_URI kunt vissen.

Maar waarom zou je overal de nodeloze toevoeging "paginas/" in je externe URL laten bestaan? Dit voegt niets toe - alle pagina's hebben dit. dus het is niet nodig om (intern) onderscheid (tussen verschillende bestanden) te maken. Korter lijkt mij in dit geval beter.
Offline Craain - 23/06/2016 21:45 (laatste wijziging 23/06/2016 21:48)
Avatar van Craain Nieuw lid Thomas, bedankt voor de moeite. Als ik goed begrijp adviseer je mij dus:
Dus zonder paginas/.

  1. if(empty($_GET['']))
  2. include("home.php");
  3. elseif(strstr($_GET[''], "index") || strstr($_GET[''], ".."))
  4. include("fout.php");
  5. elseif(file_exists("".$_GET[''].".php"))
  6. include("".$_GET[''].".php");
  7. elseif(file_exists("".$_GET[''].""))
  8. include("".$_GET['']."");
  9. else
  10. include("fout.php");
Offline Thomas - 24/06/2016 16:36
Avatar van Thomas Moderator :)

De code mag best in de subfolder paginas staan, dit staat in principe los van hoe je deze oproept via je URL - je bent namelijk zelf de persoon die de spelregels definieert voor het selecteren van de bijbehorende bronbestanden.

De pagina http://www.jouwdomein.com/test kan best zijn code halen uit /paginas/test/poging2/test.php. Tis maar net wat je in je index.php doet.

En nee, ik zou afstappen van een constructie met $_GET.

Wat je in feite in je index.php zou moeten doen met mijn .htaccess is het volgende:
$_SERVER['REQUEST_URI'] bevat het volledige pad vanaf je webroot. Je zult deze dus moeten analyseren of dit iets bevat wat correspondeert met een "bestaande" pagina. In zijn simpelste vorm zou je zoiets moeten doen:
  1. <?php
  2. $urlComponents = @parse_url(urldecode($_SERVER['REQUEST_URI']));
  3. if ($urlComponents === false) {
  4. die('malformed URL');
  5. }
  6. // We zijn enkel geinteresseerd in het pad.
  7. $path = trim($urlComponents['path'], '/');
  8.  
  9. // Zet hier je logica om op grond van $path een pagina te laden/includen
  10. // ...
  11. ?>

Maar dit is slechts een fragment van alle overwegingen die verder spelen bij het concept "routing". Stel bijvoorbeeld dat jij jouw "paginas" in de publieke webdirectory zet, iemand zou dan rechtstreekt paginas/home.php of wat dan ook kunnen aanroepen. Breekt dan je website? Moeten deze bestanden afgeschermd worden tegen rechtstreekse aanroep of wellicht buiten de webdirectory worden geplaatst? Kunnen de namen van bestanden of directories botsen met de "virtuele" URLs? Bijvoorbeeld je hebt een pagina "nieuws" maar ook een directory "nieuws", wat gebeurt er dan?

Ook voer je waarschijnlijk rechtstreeks code uit door het includen van bestanden. Bevatten deze elk een compleet en kloppend HTML-document? Je zou je dan ook kunnen afvragen waarom je je layout tig keer knipt en plakt? Wat als de layout wijzigt, moet je dan al deze bestanden na gaan lopen om dat ene ding elke keer opnieuw aan te passen?

Hoe compartimenteer je verschillende acties binnen deze "paginatypen"? Of verwerk je een formulier terwijl je al een half HTML-document aan het uitdraaien bent?

Er zijn zoveel dingen die spelen die allemaal tegelijkertijd plaatsvinden als je hiermee bezig bent dat ik niet op voorhand kan zeggen wat jij in jouw geval zou moeten doen. Het enige wat ik je kan aanraden is dat je je goed vertrouwd maakt met de materie en hier dan zelf een lijn in vindt. Ik kan je helpen met vragen, maar ik ga niet alles voorkauwen, dit is een weg die ik ook zelf afgelegd heb.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.221s