php - PHP 框架中的漂亮 URL

标签 php apache mod-rewrite url-rewriting

我知道您可以在 htaccess 中添加规则,但我发现 PHP 框架不会这样做,而且您仍然可以使用漂亮的 URL。如果服务器不知道 URL 规则,他们如何做到这一点?

我一直在寻找Yii's url manager class但我不明白它是如何做到的。

最佳答案

这通常是通过将所有请求路由到单个入口点(根据请求执行不同代码的文件)来完成的,规则如下:

# 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"]) 与路由列表进行比较 - 匹配请求的模式映射到 Controller 操作(在 MVC 应用程序中)或另一个执行路径。框架通常包括一个可以从请求本身推断出 Controller 和操作的路由,作为备用路由。

一个简单的小例子:

<?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。希望这可以帮助您理解这里发生的事情。

关于php - PHP 框架中的漂亮 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8440490/

相关文章:

php - 行未被删除

Apache RewriteCond和 friend : full or partial match?中的正则表达式模式

php - Apache 不编译 php

php - 使用 htaccess 格式化个人资料网址

javascript - 如何使用 apache 和 html 捕获所有路由

.htaccess - URL/子域重写(htaccess)

php - 用户输入多个表单字段通过php从mysql表中检索相关记录

php - 服务器在 android 上使用 volley 时不接收 JSON 对象

regex - 当我向 Htaccess 添加点运算符时出现一些错误

php - MYSQL插入语法错误