Si vous souhaitez uniquement modifier l'itinéraire picture.php
puis l'ajout de la règle de réécriture en .htaccess
sera répondre à vos besoins, mais, si vous voulez la réécriture d'URL comme dans Wordpress, alors PHP est le chemin. Ici est simple exemple pour commencer.
Structure de dossier
Il y a deux fichiers qui sont nécessaires dans le dossier racine, .htaccess
et index.php
, et il serait bon de placer le reste de l' .php
fichiers dans le 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 dans inc/
le dossier, de rediriger un appel pour que le dossier index.php
-
RewriteCond
- de permettre un accès direct à tous les autres fichiers ( images, css ou des scripts )
-
RewriteRule
- redirection de rien d'autre pour index.php
index.php
Parce que 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 sont corrects.
Pour tester l'url nous avons besoin d'avoir 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 allons tuer deux mouches d'un seul coup. Url, pour passer ce test doit avoir tous les paramètres qui sont testés sur des 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' => "/" // '/'
);
Suivante consiste à préparer l'uri de la demande.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Maintenant que nous avons l'uri de la demande, la dernière étape est de tester uri sur les règles d'expression régulière.
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 )
*/
}
}
Match de succès, puisque nous utilisons nommé sous-masques en regex, remplir l' $params
tableau presque le même que le PHP remplit l' $_GET
tableau. Cependant, lors de l'utilisation d'une url dynamique, $_GET
tableau est rempli, sans aucun contrôle des paramètres.
/image/texte/51
Tableau
(
[0] => /image/texte/51
[texte] => un peu de texte
[1] => un peu de texte
[id] => 51
[2] => 51
)
image.le php?texte=texte&id=51
Tableau
(
[texte] => un peu de texte
[id] => 51
)
Ces quelques lignes de code et une base de savoir des expressions régulières est assez pour commencer à construire un solide système de routage.
Source complet
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' );