url rewrite
Wat ik wil is dat al deze urls verwijzen naar index.php en ik /key/new/ als GET parameter gebruiken kan. Hoe kan ik dit voor elkaar krijgen? Ik heb al ik weet niet hoe lang niet meer met URL rewrite gewerkt.
Wat ik op dit moment in .htaccess heb is het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?a=$1
#RewriteRule ^ ([^/]+)/ index.php?a=$1
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?a=$1
#RewriteRule ^ ([^/]+)/ index.php?a=$1
</IfModule>
Is dit niet een goed moment om je eens te verdiepen in een php framework? Die haalt deze zorg en andere zorgen namelijk uit je handen.
Er zijn er verschillende maar misschien is cakePHP iets voor je? Pak gewoon eens een paar tutorials op youtube ;-)
Als dat goed gaat zou ik je willen vragen (ik kan het niet laten) eens naar Symfony te kijken.
Gewijzigd op 02/11/2017 17:38:50 door Frank Nietbelangrijk
Code (php)
1
2
3
2
3
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
De staart van je URL staat nu in $_GET['url'] (in z'n geheel). In PHP kan je daar nu helemaal los mee gaan.
Je kunt ook dit doen
En dan staat ie in $_SERVER['PATH_INFO'] (soms ergens anders volgens mij, doe gewoon even print_r($_SERVER) )
Als je nu een alles naar index.php doorstuurt en daar de URL verder ontleedt?
Het is trouwens niet nodig om datgene wat in de REQUEST_URI zit nogmaals in een querystring-variabele te stoppen, dit is in zekere zin ook vervuiling van $_GET. Daarnaast is het dan ook niet langer intuïtief wat in $_GET zit, want normaal gesproken kun je dit gewoon in de URL zien, terwijl je in de huidige opzet dingen onderwater injecteert in $_GET. Niet doen dus!
Ik gebruik min of meer het volgende. Het kan overigens geen kwaad om e.e.a. van commentaar te voorzien zodat je na verloop van tijd nog weet waar het voor dient:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Enable rewriting.
RewriteEngine on
# Optional: do not allow perusal of directories.
Options -Indexes
# Optional: explicitly enable per-directory rewrites in the .htaccess context.
Options +FollowSymLinks
# Required when not in the webroot. Always use a trailing slash.
RewriteBase /
# To be able to access existing directories and files (standalone scripts).
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# Redirect everything else to index.php.
# Add QSA to ensure that querystring variables are registered as such.
RewriteRule . index.php [L,QSA]
RewriteEngine on
# Optional: do not allow perusal of directories.
Options -Indexes
# Optional: explicitly enable per-directory rewrites in the .htaccess context.
Options +FollowSymLinks
# Required when not in the webroot. Always use a trailing slash.
RewriteBase /
# To be able to access existing directories and files (standalone scripts).
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# Redirect everything else to index.php.
# Add QSA to ensure that querystring variables are registered as such.
RewriteRule . index.php [L,QSA]
Vervolgens analyseer je aan de PHP-kant $_SERVER['REQUEST_URI'].
En als je geen zin hebt in een doe-het-zelf pakket dan is een framework wellicht een beter alternatief.
Gewijzigd op 02/11/2017 19:57:21 door Thomas van den Heuvel
Het 'nadeel' van REQUEST_URI vind ik dat je de evt. "query string" (het stuk na een "?" in een URL) d'r ook bij krijgt. Die kun je d'r natuurlijk ook uit pulken, maar via de PATH_INFO constructie heb je daar geen last van.
parse_url() die tevens kijkt of een URL er een beetje fris uitziet. Daarnaast is het niet verstandig om zonder meer het querystring-gedeelte te gebruiken, omdat deze in de REQUEST_URI nog url-geëncodeerd is. Dit in tegenstelling tot $_GET en $_POST, waarin de data al url-gedecodeerd is. Voor de querystring zou ik gewoon altijd $_GET (blijven) gebruiken om deze te benaderen.
Om een schoongemaakt pad te verkrijgen, zou je zoiets kunnen doen:
Of, in het kort, zonder commentaar, kun je regels 10-17 vervangen door:
Bovenstaand(e) script(s) retourneren enkel het relevante (applicatie)pad, gezien vanaf de (mogelijke subdirectory vanaf de root naar de) index.php waar naar verwezen wordt via .htaccess. (multibyte karakters in de URL daar gelaten, uiteraard)
EDIT: neemt niet weg dat er andere (en even flexibele) oplossing mogelijk zijn. Zo werd hier een tijd geleden in plaats van bovenstaande .htaccess-constructie een vele malen simpelere variant geopperd met gebruikmaking van FallbackResource. Zoals altijd vele oplossingen mogelijk.
Maar daarvoor zijn functies als Om een schoongemaakt pad te verkrijgen, zou je zoiets kunnen doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
// Read REQUEST_URI, suppress errors (gave E_WARNING prior to PHP 5.3.3).
$uriData = @parse_url($_SERVER['REQUEST_URI']);
$path = '';
if ($uriData === false) {
// Do something?
} else {
if (isset($uriData['path'])) {
// We might be in a subdirectory of the webroot.
// We are only interested in the part starting from this relative root.
$path = str_replace(DIRECTORY_SEPARATOR, '/', $uriData['path']);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', dirname($_SERVER['SCRIPT_NAME']));
// Strip the relative path from $path.
$path = substr($path, strlen($relativePath));
// Finally, strip any leading/trailing slashes so we end up with a "cleaned" path.
$path = trim($path, '/');
}
}
?>
// Read REQUEST_URI, suppress errors (gave E_WARNING prior to PHP 5.3.3).
$uriData = @parse_url($_SERVER['REQUEST_URI']);
$path = '';
if ($uriData === false) {
// Do something?
} else {
if (isset($uriData['path'])) {
// We might be in a subdirectory of the webroot.
// We are only interested in the part starting from this relative root.
$path = str_replace(DIRECTORY_SEPARATOR, '/', $uriData['path']);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', dirname($_SERVER['SCRIPT_NAME']));
// Strip the relative path from $path.
$path = substr($path, strlen($relativePath));
// Finally, strip any leading/trailing slashes so we end up with a "cleaned" path.
$path = trim($path, '/');
}
}
?>
Of, in het kort, zonder commentaar, kun je regels 10-17 vervangen door:
Code (php)
Bovenstaand(e) script(s) retourneren enkel het relevante (applicatie)pad, gezien vanaf de (mogelijke subdirectory vanaf de root naar de) index.php waar naar verwezen wordt via .htaccess. (multibyte karakters in de URL daar gelaten, uiteraard)
EDIT: neemt niet weg dat er andere (en even flexibele) oplossing mogelijk zijn. Zo werd hier een tijd geleden in plaats van bovenstaande .htaccess-constructie een vele malen simpelere variant geopperd met gebruikmaking van FallbackResource. Zoals altijd vele oplossingen mogelijk.
Gewijzigd op 03/11/2017 00:25:36 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?page=$1
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?page=$1
</IfModule>
Dit stukje code doet precies wat ik wil.
Frank Nietbelangrijk op 02/11/2017 17:34:49:
Is dit niet een goed moment om je eens te verdiepen in een php framework?
Ik ben bekend met Symfony (1.4 nog), Zend Framework, Codeignitor en cakePhp. Maar ik heb al in geen jaren meer zelf geprogrammeerd. Ik wil dit juist doen om mijn geheugen weer op te frissen.
Dit mag dan wellicht werken, maar waarom doe je dit op de bovenstaande manier? Heb je mijn reacties gelezen?
Met name dit deel:
Thomas van den Heuvel op 02/11/2017 19:55:22:
Het is trouwens niet nodig om datgene wat in de REQUEST_URI zit nogmaals in een querystring-variabele te stoppen, dit is in zekere zin ook vervuiling van $_GET. Daarnaast is het dan ook niet langer intuïtief wat in $_GET zit, want normaal gesproken kun je dit gewoon in de URL zien, terwijl je in de huidige opzet dingen onderwater injecteert in $_GET. Niet doen dus!
Gewijzigd op 03/11/2017 14:23:09 door Thomas van den Heuvel
Welkom terug dan :-) We zijn inmiddels bij versie 3.3. Waarschijnlijk is er wel het een en ander veranderd. Ik ben volgens mij ergens bij Symfony 2.6 begonnen. Daarvoor ben ik dus blanco.
Alvast bedankt!
Jan de Graaf op 08/11/2017 21:56:01:
Als iemand mij wilt helpen kun je me ook vragen om mijn skype via een privé bericht.
Alvast bedankt!
Alvast bedankt!
Je kan je vraag ook prima kwijt in een nieuw topic op dit forum. Zo kunnen meerdere mensen hun blik erop werken.
Gewijzigd op 08/11/2017 22:04:54 door - Ariën -
Alle variabelen zijn optioneel.
voorbeeldsite/ --> ga naar DefaultController::indexAction()
voorbeeldsite/contact --> ga naar ContactController::indexAction()
voorbeeldsite/contact/confirmation --> ga naar ContactController::confirmationAction()
voorbeeldsite/admin/cms/homepage --> ga naar AdminController::cmsAction($page) (page = homepage)
Niet helemaal perfect maar het werkt.
Maar waarom kijk je niet naar een bestaande oplossing?
Edit:
Misschien beter: https://www.sitepoint.com/fast-php-routing-phroute/
Misschien beter: https://www.sitepoint.com/fast-php-routing-phroute/
Gewijzigd op 08/11/2017 22:35:20 door Frank Nietbelangrijk
Frank Nietbelangrijk op 08/11/2017 22:11:27:
Die opzet is niet toereikend als je vrij wilt zijn in de naamgeving van je pagina's. Houdt wel in dat je op een andere plek wat werk moet verzetten.
Klopt. Daarom mijn Edit. Gewoon leren om Composer te gebruiken en binnen vijf minuten heb je dan een prachtige router.