Si vous souhaitez uniquement modifier l'itinéraire pour picture.php
ajouter une règle de réécriture, cela .htaccess
répondra à vos besoins, mais si vous voulez la réécriture d'URL comme dans Wordpress, PHP est le chemin. Voici un exemple simple pour commencer.
Structure des dossiers
Il y a deux fichiers nécessaires dans le dossier racine .htaccess
et index.php
, et il serait bon de placer le reste des .php
fichiers dans un dossier séparé, comme inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Ce fichier a quatre directives:
RewriteEngine
- activer le moteur de réécriture
RewriteRule
- refuser l'accès à tous les fichiers du inc/
dossier, rediriger tout appel vers ce dossier versindex.php
RewriteCond
- permettre un accès direct à tous les autres fichiers (comme les images, css ou scripts)
RewriteRule
- rediriger n'importe quoi d'autre vers index.php
index.php
Puisque tout est maintenant redirigé vers index.php, il sera déterminé si l'url est correcte, tous les paramètres sont présents et si le type de paramètres est correct.
Pour tester l'url, nous avons besoin d'un ensemble de règles, et le meilleur outil pour cela est une expression régulière. En utilisant des expressions régulières, nous tuerons deux mouches d'un seul coup. Url, pour réussir ce test doit avoir tous les paramètres requis qui sont testés sur les caractères autorisés. Voici quelques exemples de règles.
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
La prochaine étape consiste à préparer la requête uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Maintenant que nous avons la requête uri, la dernière étape consiste à tester uri sur les règles des expressions régulières.
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
Une correspondance réussie, puisque nous utilisons des sous-modèles nommés dans regex, remplira le $params
tableau presque de la même manière que PHP remplit le $_GET
tableau. Cependant, lors de l'utilisation d'une URL dynamique, le $_GET
tableau est rempli sans aucune vérification des paramètres.
/ image / un peu + texte / 51
Tableau
(
[0] => / image / du texte / 51
[text] => du texte
[1] => du texte
[id] => 51
[2] => 51
)
picture.php? text = certains + texte & id = 51
Tableau
(
[text] => du texte
[id] => 51
)
Ces quelques lignes de code et une connaissance de base des expressions régulières suffisent pour commencer à construire un système de routage solide.
Source complète
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );