mod_rewrite .htaccess
http://dreamcraft.maartenr.nl/ gaat zie je nog overal index.php?page=page staan o.i.d, dat moet omgezet worden naar /page
Ik heb vanalles gegoogled maar ben er niet uigekomen, er zijn 1400 voorbeeld scripts maar ze werken allemaal weer half,
Klein detail, alle pagina's zijn variable, dus ze stuk voor stuk rewriten in.htaccess heeft weinig zijn
Wie weet hoe dat moet, thats the question
Heeft er iemand verstand van mod_rewrite in je .htaccess bestand, ik niet namenlijk, als je nu naar Ik heb vanalles gegoogled maar ben er niet uigekomen, er zijn 1400 voorbeeld scripts maar ze werken allemaal weer half,
Klein detail, alle pagina's zijn variable, dus ze stuk voor stuk rewriten in.htaccess heeft weinig zijn
Wie weet hoe dat moet, thats the question
Verder moet je wel zelf de nieuwe URL's in je linkjes plaatsen.
deze thread eens door kunnen lezen voor inspiratie.
Zoals daar wordt aangegeven sta je voor een aantal uitdagingen:
1. het vertalen van een interne URL naar een schone URL,
2. het (terug)vertalen van een schone URL naar een interne URL en
3 (wat nogal eens vergeten wordt) een middel om je interne links consistent te houden.
Wat ik zou doen is één RewriteRule schrijven die ervoor zorgt dat alles wordt doorgestuurd naar index.php, vervolgens kun je daar $_SERVER['REQUEST_URI'] ontleden en bepalen welke pagina er opgevraagd werd.
Op die manier leg je de controle aan de PHP-kant, zodat je (inderdaad) niet eindeloos alles in je .htaccess bestand hoeft te frotten.
Je zou Zoals daar wordt aangegeven sta je voor een aantal uitdagingen:
1. het vertalen van een interne URL naar een schone URL,
2. het (terug)vertalen van een schone URL naar een interne URL en
3 (wat nogal eens vergeten wordt) een middel om je interne links consistent te houden.
Wat ik zou doen is één RewriteRule schrijven die ervoor zorgt dat alles wordt doorgestuurd naar index.php, vervolgens kun je daar $_SERVER['REQUEST_URI'] ontleden en bepalen welke pagina er opgevraagd werd.
Op die manier leg je de controle aan de PHP-kant, zodat je (inderdaad) niet eindeloos alles in je .htaccess bestand hoeft te frotten.
Gewijzigd op 27/10/2015 00:10:20 door Thomas van den Heuvel
Thomas van den Heuvel op 27/10/2015 00:09:00:
Je zou deze thread eens door kunnen lezen voor inspiratie.
Zoals daar wordt aangegeven sta je voor een aantal uitdagingen:
1. het vertalen van een interne URL naar een schone URL,
2. het (terug)vertalen van een schone URL naar een interne URL en
3 (wat nogal eens vergeten wordt) een middel om je interne links consistent te houden.
Wat ik zou doen is één RewriteRule schrijven die ervoor zorgt dat alles wordt doorgestuurd naar index.php, vervolgens kun je daar $_SERVER['REQUEST_URI'] ontleden en bepalen welke pagina er opgevraagd werd.
Op die manier leg je de controle aan de PHP-kant, zodat je (inderdaad) niet eindeloos alles in je .htaccess bestand hoeft te frotten.
Zoals daar wordt aangegeven sta je voor een aantal uitdagingen:
1. het vertalen van een interne URL naar een schone URL,
2. het (terug)vertalen van een schone URL naar een interne URL en
3 (wat nogal eens vergeten wordt) een middel om je interne links consistent te houden.
Wat ik zou doen is één RewriteRule schrijven die ervoor zorgt dat alles wordt doorgestuurd naar index.php, vervolgens kun je daar $_SERVER['REQUEST_URI'] ontleden en bepalen welke pagina er opgevraagd werd.
Op die manier leg je de controle aan de PHP-kant, zodat je (inderdaad) niet eindeloos alles in je .htaccess bestand hoeft te frotten.
Dankje, dit is wat ik nodig had, het is gelukt
Het is me gelukt om /index.php?page=about om te zetten naar /about
Nu wil ik alleen dat waneer ik /about/about-me typ hij het omzet naar index.php?page=about&action=about-me
Wie weet hoe dat moet en hoe ik dan in de html een link moet typen, ik weet dat wanneer je de eerste methode gebruikt je href moet wijzen naar /about maar hoe zit datbij twee link.
Mijn .htaccess nu:
Quote:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.*?)$ $1 [L]
RewriteRule ^(.*?)/(.*?)$ $2 [L]
RewriteRule ^(.*?)$ index.php?page=$1 [L]
RewriteRule ^(.*?)/(.*?)$ index.php?page=$1&action=$2 [L]
ErrorDocument 404 /404.php
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.*?)$ $1 [L]
RewriteRule ^(.*?)/(.*?)$ $2 [L]
RewriteRule ^(.*?)$ index.php?page=$1 [L]
RewriteRule ^(.*?)/(.*?)$ index.php?page=$1&action=$2 [L]
ErrorDocument 404 /404.php
Dus dat als je een URL van de vorm a/b hebt, er bijvoorbeeld:
- eerst gekeken wordt of er een pagina a/b bestaat,
- en anders een pagina a bestaat (met actie b)
- of alles expliciet opslaat (zie hieronder)
Ik denk dat je het probleem toch min of meer zelf hebt geïntroduceerd in je RewriteRules: je schrijft daar heel specifiek voor wat welk onderdeel betekent (of zou moeten betekenen dus), en vervolgens stop je elk van die onderdelen in een vakje (van de querystring $_GET). Het probleem is nu dat onderdelen in verkeerde vakjes terecht komen.
In zijn algemeenheid is het zo dat je RewriteRules "van specifiek naar algemeen" opstelt, want de eerste regel die (ook in jouw opzet) voldoet wordt gebruikt om de URL te herschrijven en daarna houdt het herschrijf-proces op door de [L] flag achter je Rule. Ik zou dus eigenlijk bovenstaande RewriteRules verwachten in de omgekeerde volgorde.
Maar het kan allemaal veel simpeler.
Het eerste minpunt -zoals ik het zie- in bovenstaande RewriteRules is dat je expliciet querystring-variabelen "claimt" voor het herschrijfproces. Deze zijn dus gereserveerd en kan je niet meer voor andere doeleinden gebruiken. Nu zullen er altijd van dit soort variabelen zijn, maar het is dan beter dat deze ook zichtbaar zijn (hierover later meer).
Als je deze restricties nou eens loslaat? Wil je per sé "action" onderdeel uit laten maken (in een nette vorm) van je URL? Waarom? Deze acties lijken mij vaak pagina-weergaven die toch niet gecrawled worden? Vraag je ook af waarom deze pagina's een nette URL nodig zouden hebben en of dat uberhaupt wel nut heeft.
Zoals ik al eerder aangaf: als je alles doorstuurt naar index.php kun je daar eenvoudig afleiden welke pagina je wilt bekijken. Met behulp van parse_url() van je REQUEST_URI (dit alles staat precies beschreven in het verwijzende artikel) kun je enerzijds je path bepalen en je action zit (en blijft gewoon) in $_GET (zitten). Het is in het geheel niet nodig om hiervoor querystring variabelen te reserveren/claimen via je RewriteRules.
En ja, als je toch wilt volharden in je opzet, zul je alle volledige URL's moeten opslaan in een lijst, waarbij je aangeeft wat het pad is, en hoe de bijbehorende parameters luiden (en wellicht ook welke bijbehorende code er uitgevoerd dient te worden). Dit zul je dus expliciet moeten doen, hiervoor kun je moeilijk/geen generieke regels gebruiken want dan loop je tegen de overlap in de scheiding tussen deze twee aan, dit probleem ondervindt je nu al.
Ook zul je dan op het volgende moeten letten, als je zoiets hebt:
/poll/delete?id=12
en dit wordt intern vertaald naar
/index.php?page=poll&action=delete&id=12
maar je roept dit aan via (ik zou niet weten waarom maar goed)
/poll/delete?id=12&action=hallo
welke action heeft dan voorrang, of liever gezegd, welke action-waarde zit in $_GET. Dit is niet meer evident! Je kunt niet meer uitgaan van wat je ziet (en dat is het tweede minpunt). Je zou in eerste oogopslag verwachten dan $_GET['action'] de waarde "hallo" bevat, maar deze is dus "delete" middels je RewriteRules. Maar dit wordt dus volstrekt niet duidelijk uit je URL en achterhaal je meestal pas na een debug-sessie van $_GET. Dit lijkt mij allesbehalve intuïtief werken.
Daarnaast, bovenstaande URL is een URL aan de beheerkant, dus die wordt niet gecrawled.
Anyway, ik zou het gewoon simpel houden.
Gewijzigd op 28/10/2015 15:00:59 door Thomas van den Heuvel