Versio

.htaccess rewrite url

Overzicht Reageren

Yea Rupie

Yea Rupie

09/06/2010 19:18:28
Quote Anchor link
Heej,

Ik zou graag mijn URL's rewriten, maar het werkt niet helemaal!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
RewriteEngine On
RewriteRule ^(.+) index.php?p=$1 [L]


voorbeeld URL: http://www.xxx.nl/faq
resultaat: Array ( [p] => index.php )
verwacht resultaat: Array ( [p] => faq )
 
PHP hulp

PHP hulp

24/05/2012 22:19:59
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Piet Verhagen

Piet Verhagen

09/06/2010 19:44:36
Quote Anchor link
RewriteRule regels worden steeds opnieuw uitgevoerd totdat er niets meer match. Dus eerste loop:
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.
 
Yea Rupie

Yea Rupie

09/06/2010 19:57:25
Quote Anchor link
Thx !

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
#########################################
# REWRITE RULES                         #
#########################################
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.+) index.php?p=$1 [L]
RewriteBase /
# END #
 
Yea Rupie

Yea Rupie

10/06/2010 19:19:54
Quote Anchor link
* Nieuwe vraag, zelfde script/topic

Nu wil ik een 2e en 3e GET variabel toevoegen, hoe gaat dit?
Gewijzigd op 10/06/2010 19:23:18 door Yea Rupie
 
Pim -

Pim -

10/06/2010 19:23:04
Quote Anchor link
Wat moet hier nog aan gebeuren dan?
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.
 
Yea Rupie

Yea Rupie

10/06/2010 19:28:41
Quote Anchor link
voorbeeld URL: http://www.xxx.nl/faq/6/7
verwacht resultaat: Array (
[p] => faq,
[m] => 6,
[y] => 7,
)
 
Pim -

Pim -

10/06/2010 19:33:35
Quote Anchor link
Precies gewoon in PHP doen.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$array
= array();
list($array['p'], $array['m'], $array['y']) = explode('/', trim($_GET['p'], '/'));
?>

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
}

?>
Gewijzigd op 11/06/2010 20:38:22 door Pim -
 
Piet Verhagen

Piet Verhagen

10/06/2010 20:40:54
Quote Anchor link
Ja kan in principe alles doen wat je wil. Meerdere vars gaat bijv. zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?p=$1&m=$2&o=$3 [L]

Hierbij heb ik de punt(die alles matcht) vervangen door "[^/]"(alles behalve /).
 
Yea Rupie

Yea Rupie

10/06/2010 21:09:38
Quote Anchor link
Piet Verhagen op 10/06/2010 20:40:54:
Ja kan in principe alles doen wat je wil. Meerdere vars gaat bijv. zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?p=$1&m=$2&o=$3 [L]

Hierbij heb ik de punt(die alles matcht) vervangen door "[^/]"(alles behalve /).

Hierbij kom ik in de knoop met mijn css en afbeeldingen.
 
Jelmer rrrr

Jelmer rrrr

10/06/2010 22:22:06
Quote Anchor link
Bedoel je dat die ook gerewrite worden? Nee toch? Want daar zorgen je twee RewriteCond regels al voor.

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.
 
Yea Rupie

Yea Rupie

10/06/2010 22:33:52
Quote Anchor link
Ik heb het gewoon allemaal in 1 map en de images appart:
<link href="default.css" rel="stylesheet" type="text/css" media="all" />
 
Jelmer rrrr

Jelmer rrrr

10/06/2010 22:35:47
Quote Anchor link
<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.
 
Piet Verhagen

Piet Verhagen

10/06/2010 23:12:02
Quote Anchor link
Jah maar ... je moet het zelf een beetje specificeren.
Yea Rupie op 10/06/2010 19:28:41:

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.
 
Yea Rupie

Yea Rupie

11/06/2010 17:07:17
Quote Anchor link
mmm.. Ik heb nu deze code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
RewriteRule ^([^/]+)/([0-9/]{1,2})/([0-9/]{1,4}) index.php?p=$1&m=$2&y=$3 [L]

Hij gaat nog niet helemaal goed,
$2 = Maand
$3 = Jaartal
 
Jelmer rrrr

Jelmer rrrr

11/06/2010 17:41:20
Quote Anchor link
Wat gaat er dan mis? En waarom heb je / ook in je mogelijke karakters staan?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^([^/]+)/(\d{1,2})/(\d{1,4})/?
 
Yea Rupie

Yea Rupie

11/06/2010 17:54:58
Quote Anchor link
Jelmer rrrr op 11/06/2010 17:41:20:
Wat gaat er dan mis? En waarom heb je / ook in je mogelijke karakters staan?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^([^/]+)/(\d{1,2})/(\d{1,4})/?


De pagina laad niet correct, de css doet het niet en de plaatjes ook niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 #
 
Jelmer rrrr

Jelmer rrrr

11/06/2010 17:56:12
Quote Anchor link
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

Yea Rupie

11/06/2010 17:57:24
Quote Anchor link
Yea Rupie op 11/06/2010 17:54:58:
Jelmer rrrr op 11/06/2010 17:41:20:
Wat gaat er dan mis? En waarom heb je / ook in je mogelijke karakters staan?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^([^/]+)/(\d{1,2})/(\d{1,4})/?


De pagina laad niet correct, de css doet het niet en de plaatjes ook niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 #




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
 
Jelmer rrrr

Jelmer rrrr

11/06/2010 19:27:09
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
RewriteRule ^([^/]+)$ index.php?page=$1 [L]

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.
 
Piet Verhagen

Piet Verhagen

11/06/2010 20:32:29
Quote Anchor link
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.
 
Pim -

Pim -

11/06/2010 20:38:06
Quote Anchor link
Heb je mijn post over het in PHP regelen van routes überhaupt gelezen?
 



Overzicht Reageren

Get Adobe Flash player