Красивые URL в PHP-фреймворках - PullRequest
17 голосов
/ 09 декабря 2011

Я знаю, что вы можете добавлять правила в htaccess, но я вижу, что PHP-фреймворки этого не делают, и у вас все равно есть красивые URL-адреса. Как они это делают, если сервер не знает правила URL?

Я искал класс менеджера URL Yii , но я не понимаю, как он это делает.

1 Ответ

16 голосов
/ 09 декабря 2011

Обычно это делается путем маршрутизации всех запросов в одну точку входа (файл, который выполняет другой код на основе запроса) с помощью правила, подобного:

# 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;

В сочетании с первой конфигурацией это простой скрипт, который позволит вам использовать URL-адреса, такие как domain.com/about. Надеюсь, это поможет вам понять, что здесь происходит.

...