[英]Pretty URLs in PHP frameworks
我知道您可以在 htaccess 中添加规则,但我看到 PHP 框架不会这样做,并且不知何故您仍然拥有漂亮的 URL。 如果服务器不知道 URL 规则,他们如何做到这一点?
我一直在寻找Yii 的url manager 课程,但我不明白它是如何做到的。
这通常是通过使用以下规则将所有请求路由到单个入口点(根据请求执行不同代码的文件)来完成的:
# 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]
然后,该文件将请求( $_SERVER["REQUEST_URI"]
)与路由列表进行比较 - 将请求匹配到控制器操作(在 MVC 应用程序中)或其他执行路径的模式的映射。 框架通常包含一个路由,可以从请求本身推断控制器和操作,作为备份路由。
一个小的、简化的例子:
<?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;
结合第一个配置,这是一个简单的脚本,允许您使用domain.com/about
URL。 希望这可以帮助您理解这里发生的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.