[PHP] mod_rewrite beheren met database?

Pagina: 1
Acties:
  • 987 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is het mogelijk om een URL "vriendelijk" te maken door mod_rewrite te gebruiken i.c.m. een database?

De volgende url:
www.mijndomein.nl/index.php?i=1&c=3

moet dan worden:
www.mijndomein.nl/vakantie/griekienland/

De woorden vakantie en griekenland moeten dan uit de database gehaald worden a.d.h.v. i=1 en c=3 en de url herschreven naar www.mijndomein.nl/vakantie/griekienland/

Ik heb uiteraard al gegoogled en geGoT, maar kon niets vinden wat hier een antwoord op kon geven. Ik weet van Joomla dat daar een SEF component voor is die van alles in de database stop. Deze heeft daar volgens mij een eigen "engine" (als ik dat zo mag zeggen) voor.

Als iemand mij een link of een setje in de goede richting kan geven dan ben ik al heel blij. :*)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Vaak heb je mod_rewrite niet eens nodig, je kunt gewoon multiviews aanzetten en dan krijg je zoals hierboven uitgelegd gewoon de url uit een van de $_SERVER variabelen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik gebruik dit al jaren:

code:
1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+) index.php/$1 [L]


Dat wil zeggen, als het gevraagde pad geen bestaand bestand of directory is forwardt ie de request naar index.php. In index.php kun je vervolgens aan de hand van $_SERVER['PATH_INFO'] naar hartelust doen wat je hartje begeert.

Rustacean


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Manuzhai schreef op dinsdag 24 juli 2007 @ 17:38:
Volgens mijn host zou mod_rewrite aan staan. Op de vraag of multiviews aan staat heb ik nog geen antwoord.

code:
1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+) index.php/$1 [L]


Dat wil zeggen, als het gevraagde pad geen bestaand bestand of directory is forwardt ie de request naar index.php. In index.php kun je vervolgens aan de hand van $_SERVER['PATH_INFO'] naar hartelust doen wat je hartje begeert.
Ik heb dit geprobeerd met Options +MultiViews boven in de .htaccess, maar ik krijg bij alles* de melding No input file specified.

*:
http://test.rsvdv.nl/rewrite/index/
http://test.rsvdv.nl/rewrite/index.php/1/2/
enz.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Voor zover ik weet geeft Apache die melding niet, die geef je zelf ergens in je code. Toch?

[ Voor 71% gewijzigd door frickY op 24-07-2007 18:11 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
frickY schreef op dinsdag 24 juli 2007 @ 18:10:
Voor zover ik weet geeft Apache die melding niet, die geef je zelf ergens in je code. Toch?
Die wordt door PHP gegeven volgens mij. Ik ben er nog niet helemaal uit. Misschien dat deze pagina nog wat hulp kan bieden. Ik laat het weten. :9

--edit---

Daar word ik dus ook niet wijzer van. Ik geloof wel dat ik beter MultiViews kan gebruiken voor wat ik wil. Ik heb volgens mij ook mod_rewrite en MultiViews door elkaar gehaald.

Nu ik weet dat er ook nog zoiets als MultiViews bestaat heb ik weer het e.e.a. geprobeerd, zowel lokaal (windows xp met xampp-lite php5) als op de server (linux php 4.4.2 ). Volgens mijn hosting provider staan zowel mod_rewrite en MultiViews aan.

Inhoud van .htaccess:
code:
1
Options MultiViews


inhoud van index.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$dir = 2; // In hoeveel dirs staat je script

$vars = substr($_SERVER['REQUEST_URI'], 1);

$vars = explode("/", $vars);

for($i = $dir; $i < count($vars); $i++) {
    $key = $vars[$i];    
    $inhoud = $vars[$i];
    $urls[$key] = $inhoud;
}

// De rest van je site
?> 

$dir staat voor het aantal dirs waar je je script in hebt staan. Staat je script in de root dan is het 0. Staat je script bijvoorbeeld in www.jousite.com/map1/map2/ dan is het 2.

Lokaal werkt dit prima wanneer ik bijvoorbeeld http://localhost/test/multiviews/index/1/2/3 doe, dan geeft ie netjes dit:
code:
1
2
3
4
5
6
Array
(
    [1] => 1
    [2] => 2
    [3] => 3
)


Doe ik dan op de server precies het zelfde, dan geeft ie: No input file specified.
Daarvoor hoef ik eigenlijk alleen maar een / achter index.php te zetten. Dan krijg ik die fout al. http://test.rsvdv.nl/index, dus zonder .php werkt weer wel, maar http://test.rsvdv.nl/index/ weer niet. 8)7

Wie O Wie?

[ Voor 65% gewijzigd door Verwijderd op 25-07-2007 01:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat je kan doen is in htaccess met reguliere expressies de waardes van de 1ste en tweede slash ophalen.
Dus vakantie en griekenland

Deze zou je mee kunnen geven in een bepaalde variabele aan je php code, en DIE kan daar een koppeling leggen met het bijbehorende ID.

Acties:
  • 0 Henk 'm!

  • pimlie
  • Registratie: November 2000
  • Laatst online: 16:52
Manuzhai schreef op dinsdag 24 juli 2007 @ 17:38:
Ik gebruik dit al jaren:
*knip*
In index.php kun je vervolgens aan de hand van $_SERVER['PATH_INFO'] naar hartelust doen wat je hartje begeert.
Naar mijn idee kan je toch beter doen wat Manuzhai al zei, de PATH_INFO variabele gebruiken. Daarvoor moet je wel in je server config of .htaccess AcceptPathInfo aanzetten, zie hier voor de docs. Je hoeft dan niet meer in je php code te kijken welk stuk van je REQUEST_URI je script is en welk stuk de variabelen.

De rewrite rules van Manuzhai zijn over het algemeen prima, maar deze zijn nog iets completer:
code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{IS_SUBREQ} false
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l
RewriteRule (.*) /path/to/index$1 [L] # 'index$1' als je multiviews aan hebt, 'index.php$1' als je dat niet hebt


Succes! ;)

Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 23:09
pimlie schreef op woensdag 25 juli 2007 @ 08:57:
[...]


Naar mijn idee kan je toch beter doen wat Manuzhai al zei, de PATH_INFO variabele gebruiken. Daarvoor moet je wel in je server config of .htaccess AcceptPathInfo aanzetten, zie hier voor de docs. Je hoeft dan niet meer in je php code te kijken welk stuk van je REQUEST_URI je script is en welk stuk de variabelen.

De rewrite rules van Manuzhai zijn over het algemeen prima, maar deze zijn nog iets completer:
code:
1
2
3
4
5
6
RewriteEngine On
RewriteCond %{IS_SUBREQ} false
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l
RewriteRule (.*) /path/to/index$1 [L] # 'index$1' als je multiviews aan hebt, 'index.php$1' als je dat niet hebt


Succes! ;)
Ik ben dit topic stiekem mee aan het lezen en vind het best interessant. Maar zou je voor deze regular expression leek eens uit willen leggen wat dit stukje code precies doet?

omniscale.nl


Acties:
  • 0 Henk 'm!

  • pimlie
  • Registratie: November 2000
  • Laatst online: 16:52
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Enable rewrite engine
RewriteEngine On
# Continue if current request is not a sub request: to avoid loops when redirecting url's 
# after rewriting (actually not used here, useful if you use e.g. [R=301] instead of [L])
RewriteCond %{IS_SUBREQ} false
# Continue if REQUEST_FILENAME is not a directory
# with %{DOCUMENT_ROOT}%{REQUEST_FILENAME} we have an absolute path
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
# Continue if REQUEST_FILENAME is not a file
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
# Continue if REQUEST_FILENAME is not a symbolic link
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l
# Rewrite request to /path/to/index followed by %{REQUEST_FILENAME} relative of /path/to
# Use 'index$1' only if multiviews enabled, otherwise use 'index.php$1' 
RewriteRule ^/path/to(.*)$ /path/to/index$1 [L]


vb1: index.php in document root: path to = /
RewriteRule ^/(.*)$ /index$1 [L]
index: http://domain.net/index.php
request: http://domain.net/artikelen/nr/4
wordt herschreven naar: http://domain.net/index.php/artikelen/nr/4
met _SERVER["PATH_INFO"] = '/artikelen/nr/4'

vb2: index.php lager dan document root: path to = /dir
RewriteRule ^/dir(.*)$ /dir/index$1 [L]
index: http://domain.net/dir/index.php
request: http://domain.net/dir/artikelen/nr/4
wordt herschreven naar: http://domain.net/dir/index.php/artikelen/nr/4
met _SERVER["PATH_INFO"] = '/artikelen/nr/4'

vb3: index.php lager dan document root: path to = /dir, incomplete rewriterule
RewriteRule ^/(.*)$ /dir/index$1 [L]
index: http://domain.net/dir/index.php
request: http://domain.net/dir/artikelen/nr/4
wordt herschreven naar: http://domain.net/dir/index.php/dir/artikelen/nr/4
met _SERVER["PATH_INFO"] = '/dir/artikelen/nr/4'

Maar staat ook gewoon allemaal in de mod_rewrite sectie van de apache manual inclusief link naar de PCRE docs :)

Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 23:09
Bedankt voor de uitleg! d:)b

omniscale.nl

Pagina: 1