Maison > Questions et réponses > le corps du texte
Je sais que vous pouvez ajouter des règles dans htaccess, mais j'ai trouvé que les frameworks PHP ne le font pas et que d'une manière ou d'une autre, vous avez toujours de belles URL. Comment les serveurs peuvent-ils faire cela s'ils ne connaissent pas les règles d'URL ?
Je cherchais la classe de gestionnaire d'URL de Yii, mais je ne comprends pas comment c'est fait.
P粉8019040892023-10-31 08:17:16
Cela se fait généralement en acheminant toutes les requêtes vers un seul point d'entrée (un fichier qui exécute un code différent en fonction de la requête), avec les règles suivantes :
# Redirect everything that doesn't match a directory or file to index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php [L]
Le fichier compare ensuite la requête ($_SERVER["REQUEST_URI"]
) à une liste de routes - des modèles qui correspondent à la requête, mappant les chemins d'exécution aux actions du contrôleur (dans une application MVC) ou à d'autres actions. Les frameworks incluent souvent une route qui peut déduire des contrôleurs et des actions à partir de la requête elle-même, en tant que route de secours.
Un exemple simple :
<?php // Define a couple of simple actions class Home { public function GET() { return 'Homepage'; } } class About { public function GET() { return 'About page'; } } // Mapping of request pattern (URL) to action classes (above) $routes = array( '/' => 'Home', '/about' => 'About' ); // Match the request to a route (find the first matching URL in routes) $request = '/' . trim($_SERVER['REQUEST_URI'], '/'); $route = null; foreach ($routes as $pattern => $class) { if ($pattern == $request) { $route = $class; break; } } // If no route matched, or class for route not found (404) if (is_null($route) || !class_exists($route)) { header('HTTP/1.1 404 Not Found'); echo 'Page not found'; exit(1); } // If method not found in action class, send a 405 (e.g. Home::POST()) if (!method_exists($route, $_SERVER["REQUEST_METHOD"])) { header('HTTP/1.1 405 Method not allowed'); echo 'Method not allowed'; exit(1); } // Otherwise, return the result of the action $action = new $route; $result = call_user_func(array($action, $_SERVER["REQUEST_METHOD"])); echo $result;
Combiné avec la première configuration, il s'agit d'un script simple qui vous permet d'utiliser des URL comme domain.com/about
. J'espère que cela vous aide à comprendre ce qui se passe ici.