Tout d'abord, nous allons créer les fichiers index.php, router.php et .htaccess.
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA]
Ce code affichera une réponse 404 si l'utilisateur saisit l'URL pour accéder directement à router.php.
<?php if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { http_response_code(404); die(); }
class Page { protected static bool $Return_404 = true; }
Créez une variable booléenne statique pour renvoyer la page 404. Nous le définirons sur true par défaut.
Nous ajoutons maintenant une fonction pour la page 404.
protected static function Return_404(): void { (file_exists("./Pages/404.php")) ? require_once "./Pages/404.php" : http_response_code(404); }
Ici, j'ai mis une page 404 dans le dossier Pages. Vous pouvez le mettre dans n'importe quel dossier de votre choix.
Nous ajouterons également la fonction "Fichier".
protected static function File(string $file): string { if (!empty($file)) { (str_contains($file, "?")) ? $file = strtok($file, '?') : $file; ($file[strlen($file) - 1] === "/") ? $file = rtrim($file, "/") : $file; } return $file; }
Cette fonction vérifiera si l'URL de la requête contient une chaîne de requête ou se termine par "/" et la supprimera.
J'utilise la fonction de chaîne "strok" pour obtenir les valeurs de chaîne avant "?". Je sais que "strok" n'est pas destiné à être utilisé comme ça, mais cela fonctionne et m'évite de faire inutilement des algorithmes complexes. J'utilise la fonction de chaîne "rtrim" pour supprimer le "/" s'il est contenu à la fin de la chaîne.
class Routes { public static array $Route = array( "" => "Pages/home.php", "/about" => "Pages/about.php", ); }
Ici, je crée un tableau statique pour stocker les routages.
Ce tableau contient "URL demandée" => "Emplacement du fichier".
J'ai mis tous les fichiers de page dans le dossier Pages. Vous pouvez les placer où vous voulez.
La classe Router s'étendra de la classe Page que nous avons déjà créée ci-dessus.
Notez que "" => "Pages/home.php", est pour la page d'accueil.
class Router extends Page { }
Maintenant, nous allons écrire la fonction qui vérifie si le fichier demandé existe dans la classe Router.
public static function Run(): void { $requested_file = self::File($_SERVER["REQUEST_URI"]); foreach (Routes::$Route as $request => $file) { if ($requested_file === $request) { if (file_exists($file)) { self::$Return_404 = false; require $file; } else echo "Error"; } } if (self::$Return_404) self::Return_404(); }
Cette fonction vérifie d'abord que le fichier demandé se trouve dans le tableau $Route. S'il existe, le booléen statique $Return_404 est défini sur false afin que la page 404 ne s'affiche pas et n'obtienne pas le fichier d'échange. S'il n'existe pas, cela renverra la page 404.
S'il existe mais qu'il n'y a aucun fichier dans le dossier Pages, la fonction fera écho à "Erreur". Vous pouvez afficher la page 404 au lieu de faire écho "Erreur" ici.
<?php if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { http_response_code(404); die(); } class Page { protected static bool $Return_404 = true; protected static function Return_404(): void { (file_exists("./Pages/404.php")) ? require_once "./Pages/404.php" : http_response_code(404); } protected static function File(string $file): string { if (!empty($file)) { (str_contains($file, "?")) ? $file = strtok($file, '?') : $file; ($file[strlen($file) - 1] === "/") ? $file = rtrim($file, "/") : $file; } return $file; } } class Router extends Page { public static function Run(): void { $requested_file = self::File($_SERVER["REQUEST_URI"]); foreach (Routes::$Route as $request => $file) { if ($requested_file === $request) { if (file_exists($file)) { self::$Return_404 = false; require $file; } else echo "Error"; } } if (self::$Return_404) self::Return_404(); } } class Routes { public static array $Route = array( "" => "Pages/home.php", "/about" => "Pages/about.php", ); }
Dans le index.php, nous utiliserons la fonction "Run" de la classe Router.
<!DOCTYPE html> <html lang="en"> <?php require_once "./router.php"; ?> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Router</title> </head> <body> <?php Router::Run(); ?> </body> </html>
Tout le code HTML des pages sera dans la balise "body".
Enfin, créez home.php, about.php et 404.php dans le dossier Pages.
home.php
<h1>Home page</h1>
à propos.php
<h1>about page</h1>
404.php
<h1>404 page</h1>
Vérifiez si le code fonctionne ou non avec l'extension "xampp" ou "Serveur PHP".
Si vous rencontrez une erreur, n'hésitez pas à me le dire. XD
Vous pouvez également consulter le référentiel github à l'adresse :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!