Sélectionner une page


Si vous souhaitez simplement modifier l’itinéraire pour picture.php Ensuite, ajoutez la règle de réécriture .htaccess répondra à vos besoins, mais si vous voulez que l’URL soit réécrite comme dans wordpress, php est la voie à suivre. Tout d’abord, voici un exemple simple.

Structure des dossiers

Deux fichiers sont requis dans le dossier racine: .htaccess et index.phpet il serait bon de placer le reste du .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 contient quatre déclarations:

  1. RewriteEngine – Activer le moteur de réécriture
  2. RewriteRule – Refuser l’accès à tous les fichiers dans inc/ Dossier, redirigez chaque appel vers ce dossier vers index.php
  3. RewriteCond – Autorisez l’accès direct à tous les autres fichiers (tels que les images, CSS ou scripts).
  4. RewriteRule – rediriger tout le reste vers index.php

index.php

Puisque tout est maintenant redirigé vers index.php, il est déterminé si l’URL est correcte, tous les paramètres sont présents et si le type de paramètres est correct.

Afin de tester l’url, nous avons besoin d’un ensemble de règles et le meilleur outil pour cela est une expression régulière. Avec des expressions régulières, nous tuons deux oiseaux d’un seul coup. L’URL, pour réussir ce test, doit contenir tous les paramètres requis qui sont testés sur des caractères légaux. 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'      => "https://stackoverflow.com/"                                      // "https://stackoverflow.com/"
);

Ensuite, préparez la requête uri.

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), "https://stackoverflow.com/" );
$uri = "https://stackoverflow.com/" . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), "https://stackoverflow.com/" );
$uri = urldecode( $uri );

Une fois que nous avons la requête uri, la dernière étape consiste à tester uri par rapport aux 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 )
         */
    }
}

Parce que nous utilisons des sous-modèles nommés dans regex, ce sera une correspondance réussie $params Array presque le même que PHP remplit le $_GET Déployer. Cependant, si vous utilisez une URL dynamique, $_GET Le tableau est rempli sans vérifier les paramètres.

    /picture/some+text/51

    Array
    (
        [0] => /picture/some text/51
        [text] => some text
        [1] => some text
        [id] => 51
        [2] => 51
    )

    picture.php?text=some+text&id=51

    Array
    (
        [text] => some text
        [id] => 51
    )

Ces quelques lignes de code et une connaissance de base des expressions régulières sont suffisantes pour 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'      => "https://stackoverflow.com/"                                      // "https://stackoverflow.com/"
);

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), "https://stackoverflow.com/" );
$uri = "https://stackoverflow.com/" . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), "https://stackoverflow.com/" );
$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' );



Source link

Recent Posts