.htaccess rewrite url
Ik zou graag mijn URL's rewriten, maar het werkt niet helemaal!
voorbeeld URL: http://www.xxx.nl/faq
resultaat: Array ( [p] => index.php )
verwacht resultaat: Array ( [p] => faq )
faq -> index.php?p=faq
Tweede loop:
index.php -> index.php?p=index.php
Derde loop is zelfde, dat snaptie, en dan stoptie. Je zult dus het dus zodanig moeten maken dat de tweede loop niet matcht. Dit kan je bijv. doen met een RewriteCond regel.
Nu wil ik een 2e en 3e GET variabel toevoegen, hoe gaat dit?
Gewijzigd op 10/06/2010 19:23:18 door Yea Rupie
Het is veel beter als je gewoon de hele query in die ene parameter doet en er dan met PHP mee aan de slag gaat: dat is veel flexibeler.
Je kan dit op allemaal manieren oplossen.
Kijk ook eens naar Zend_Controller_Route, in mijn ogen dicht bij de ideale oplossing.
Als je maar 1 route hebt kan het natuurlijk heel makkelijk:
Code (php)
Maar als je meerdere mogelijkheden wilt toestaan wordt het ingewikkelder.
Je moet het 'strategy' patroon toepassen.
Dan maak je een router die de routes regelt. Bij een request gaat de router alle routes af en als er 1 'past' wordt die geselecteerd en uitgevoerd.
Edit:
Voorbeeld, in OO
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class Router
{
protected $_routes = array();
public function addRoute(Route $route)
{
$this->_routes[] = $route;
}
public function dispatch($query)
{
$query = trim($query, '/');
// Zoek in omgekeerde volgorde
for($i = count($this->_routes)-1; $i<=0; $i--) {
if($this->_routes[$i]->fits($query)) return $this->_routes[$i]->getParams();
}
throw new Exception('No route found for '.$query);
}
}
interface Route
{
protected $_query, $_params;
// Controleert of de query past in de route en zo ja, vult de gevonden parameters in in $_params
public function fits($query);
public function getParams();
}
?>
class Router
{
protected $_routes = array();
public function addRoute(Route $route)
{
$this->_routes[] = $route;
}
public function dispatch($query)
{
$query = trim($query, '/');
// Zoek in omgekeerde volgorde
for($i = count($this->_routes)-1; $i<=0; $i--) {
if($this->_routes[$i]->fits($query)) return $this->_routes[$i]->getParams();
}
throw new Exception('No route found for '.$query);
}
}
interface Route
{
protected $_query, $_params;
// Controleert of de query past in de route en zo ja, vult de gevonden parameters in in $_params
public function fits($query);
public function getParams();
}
?>
Gewijzigd op 11/06/2010 20:38:22 door Pim -
Hierbij heb ik de punt(die alles matcht) vervangen door "[^/]"(alles behalve /).
Piet Verhagen op 10/06/2010 20:40:54:
Hierbij kom ik in de knoop met mijn css en afbeeldingen.
Of bedoel je dat je relatieve paden gebruikt? Dan heb je volgens mij twee gemakkelijke oplossingen: absolute paden gebruiken (beginnend met een /) maar dat is onhandig als je lokaal in een map en op de server in de root je site draait. Andere optie is <base href="/mijn/site/"> in de head van je HTML zetten, dan wordt dat pad altijd als basis voor je relatieve regels gebruikt.
<link href="default.css" rel="stylesheet" type="text/css" media="all" />
<base href="/absolute/url/naar/site"> of, waarschijnlijk aan je rewrite regels te zien dus simpelweb <base href="/"> aan HEAD toevoegen zou dat al moeten oplossen.
Yea Rupie op 10/06/2010 19:28:41:
voorbeeld URL: http://www.xxx.nl/faq/6/7
Op een plek waar je een cijfer verwacht, zoals die 6 en die 7 kun je "[0-9]+" doen of bijv. nog exacter "[0-9]{1,3}"(minimaal 1 cijfer, max 3). En zodoende moet je het geheel zodanig in elkaar steken dat er geen conflicten optreden.
Hij gaat nog niet helemaal goed,
$2 = Maand
$3 = Jaartal
Jelmer rrrr op 11/06/2010 17:41:20:
De pagina laad niet correct, de css doet het niet en de plaatjes ook niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
#########################################
# REWRITE RULES #
#########################################
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^/]+) index.php?page=$1 [L]
RewriteRule ^([^/]+)/(\d{1,2})/(\d{1,4}) index.php?p=$1&m=$2&y=$3 [L]
RewriteBase /
# END #
# REWRITE RULES #
#########################################
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^/]+) index.php?page=$1 [L]
RewriteRule ^([^/]+)/(\d{1,2})/(\d{1,4}) index.php?p=$1&m=$2&y=$3 [L]
RewriteBase /
# END #
Dat komt omdat je relatieve paden gebruikt voor je css en plaatjes. Die denken dat ze in de map /pagina/1/2/ moeten zoeken. Zie mijn reacties over <base> en absolute urls.
Yea Rupie op 11/06/2010 17:54:58:
De pagina laad niet correct, de css doet het niet en de plaatjes ook niet.
Jelmer rrrr op 11/06/2010 17:41:20:
De pagina laad niet correct, de css doet het niet en de plaatjes ook niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
#########################################
# REWRITE RULES #
#########################################
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^/]+) index.php?page=$1 [L]
RewriteRule ^([^/]+)/(\d{1,2})/(\d{1,4}) index.php?p=$1&m=$2&y=$3 [L]
RewriteBase /
# END #
# REWRITE RULES #
#########################################
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^/]+) index.php?page=$1 [L]
RewriteRule ^([^/]+)/(\d{1,2})/(\d{1,4}) index.php?p=$1&m=$2&y=$3 [L]
RewriteBase /
# END #
Bij een url van : home/6/2010
Is dit de $_GET variabel: Array ( [page] => home )
en als ik base gebruik, komt die in home/6/
verder zal ik overal dit voorzetten: http://www.xxx.nl
Gewijzigd op 11/06/2010 18:02:32 door Yea Rupie
Die $ aan het eind van het pattern staat voor "het einde". Als er niets na komt, matcht die regel niet.
Andere oplossing is om gewoon die twee RewriteRules om te wisselen, zodat de minst-specifieke, die dus het meeste matcht, onderaan staat.
Yea Rupie op 11/06/2010 17:57:24:
verder zal ik overal dit voorzetten: http://www.xxx.nl
Complete domeinnaam hoeft er niet voor, pad beginnen met een / kan ook.
Heb je mijn post over het in PHP regelen van routes überhaupt gelezen?