Как в PHP получить URL текущего раздела сайта и его составляющие

Раздел: Управление контентом -> Разделы PHP

Разбор URL раздела в PHP: основные подходы

Как определить название раздела из URL с помощью parse_url?

Самое прямое и часто используемое решение – разбор текущего адреса с помощью встроенной функции parse_url и последующее извлечение первого сегмента пути. Этот вариант подходит для большинства сайтов с простой структурой разделов.


$url = $_SERVER['REQUEST_URI'];
$path = parse_url($url, PHP_URL_PATH);
$segments = explode('/', trim($path, '/'));
$section = $segments[0] ?? '';
echo $section;

Section php url (url раздела php)

Код получает путь из глобальной переменной, удаляет обрамляющие слеши, разбивает на массив и берёт первый элемент. Если перейти на страницу /blog/article?id=5, в результате появится blog.

Проблемы: при отсутствии слеша после имени хоста $path может быть пустым; если в URL есть много сегментов, а нужно только имя раздела, остальные отбрасываются. Ошибка – использование $_SERVER['REQUEST_URI'] без проверки на существование (хотя она всегда есть).

Как задать раздел через GET-параметр?

Классический метод – передача имени раздела в URL как параметра, например /index.php?section=blog. Простота реализации подходит для старых проектов или административных панелей, где ЧПУ не требуется.


$section = $_GET['section'] ?? 'home';
echo $section;

Indices php section (индексы разделов php)

Назначение: быстрая разработка без маршрутизации. Используется в учебных целях или на локальных серверах.

Проблемы: некрасивые URL, подверженность XSS при выводе без кодирования, сложность с иерархией разделов (придётся добавлять дополнительные параметры). Решение – всегда фильтровать ввод: htmlspecialchars($section).

Как извлечь раздел регулярным выражением?

Если нужно получить не только первый сегмент, но и проверить его формат (например, только латинские буквы), применяются регулярные выражения. Метод даёт тонкий контроль, но сложнее для чтения.


$pattern = '#^/([a-zA-Z]+)#';
preg_match($pattern, $_SERVER['REQUEST_URI'], $matches);
$section = $matches[1] ?? '';
echo $section;

Catalog php section id (каталог разделов по id php)

Этот код извлекает первый сегмент пути, состоящий только из букв. Для URL /php-news ничего не вернёт, так как дефис не входит в класс.

Ошибки: забыть экранировать слэш в шаблоне, не учесть якорь начала строки ^. Если путь пустой, $matches[1] вызовет предупреждение – нужна проверка.

Как создать маршрутизатор для разделов?

Для многоуровневых разделов удобно написать класс-маршрутизатор. Он позволяет сопоставлять шаблоны URL с обработчиками и поддерживает параметры.


class Router {
    private $routes = [];
    public function add($pattern, $callback) {
        $this->routes[$pattern] = $callback;
    }
    public function dispatch($url) {
        $path = parse_url($url, PHP_URL_PATH);
        foreach ($this->routes as $pattern => $callback) {
            if (preg_match($pattern, $path, $matches)) {
                call_user_func($callback, $matches);
                return;
            }
        }
        echo '404: раздел не найден';
    }
}
$router = new Router();
$router->add('#^/blog/(\d+)#', function($m) { echo "Статья ID: $m[1]"; });
$router->add('#^/about#', function() { echo "О нас"; });
$router->dispatch($_SERVER['REQUEST_URI']);

Content php section id (контент раздела по id php)

При переходе на /blog/42 вызовется первый коллбэк, при /about – второй. Такой подход используется в современных фреймворках.

Проблемы: производительность при большом количестве маршрутов; сложность с подстановками, если не учитывать лимит памяти. Решение – кеширование скомпилированных маршрутов.

Как настроить ЧПУ через .htaccess?

Для красивых URL без index.php в адресе используется Apache с mod_rewrite. Все запросы перенаправляются на единый фронт-контроллер, который разбирает путь.


# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

Index php section id (маршрут index.php с id раздела php)

В PHP получаем $_GET['route'] и обрабатываем его как путь.


$route = $_GET['route'] ?? '';
$segments = explode('/', trim($route, '/'));
$section = $segments[0] ?? 'home';
echo $section;

Это даёт ссылки вида /catalog/product.

Ошибки: mod_rewrite не включён, правила не срабатывают из-за опции AllowOverride. Решение – проверять сервер, использовать исключения для реальных файлов (стили, скрипты).

- Section php id 0 (раздел php с id=0)
- Php section 1 (раздел php с id=1)
- Section php id 2 (раздел php с id=2)

Расширенные примеры работы с URL раздела

Пример 1: Получение первого и второго уровней раздела

Пример

$url = "/forum/php/thread?id=100";
$path = parse_url($url, PHP_URL_PATH);
$segments = array_values(array_filter(explode('/', $path)));
$level1 = $segments[0] ?? '';
$level2 = $segments[1] ?? '';
echo "Первый уровень: $level1, второй: $level2";
Первый уровень: forum, второй: php

Пояснение: array_filter удаляет пустые элементы, array_values переиндексирует. Так можно обрабатывать вложенность.

Пример 2: Извлечение раздела с проверкой на существование файла

Пример

$url = "/images/logo.png";
$path = parse_url($url, PHP_URL_PATH);
$file = __DIR__ . $path;
if (file_exists($file)) {
    echo "Это файл, не раздел";
} else {
    $segments = explode('/', trim($path, '/'));
    $section = $segments[0];
    echo "Раздел: $section";
}
Это файл, не раздел

Пояснение: проверка на наличие реального файла помогает отделить запросы к статике от маршрутов разделов.

Пример 3: Маршрутизация с именованными параметрами

Пример

$url = "/profile/user/42";
$pattern = '#^/profile/user/(\d+)$#';
if (preg_match($pattern, $url, $matches)) {
    $userId = (int)$matches[1];
    echo "Профиль пользователя ID: $userId";
} else {
    echo "Неверный формат URL";
}
Профиль пользователя ID: 42

Пояснение: использование группы захвата для числового ID. Ограничение якорем конца строки $ предотвращает ложные срабатывания.

Пример 4: .htaccess с обработкой 404 для несуществующих разделов

Пример

# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]
Пример

// index.php
$route = $_GET['route'] ?? '';
$allowedSections = ['home', 'blog', 'contact'];
$section = explode('/', $route)[0];
if (!in_array($section, $allowedSections)) {
    http_response_code(404);
    echo "Раздел не найден";
} else {
    echo "Раздел: $section";
}
При переходе на /feedback (если feedback не в списке):
Код 404 и сообщение "Раздел не найден"

Пояснение: белый список разделов защищает от произвольного вызова скриптов и позволяет выводить правильную ошибку 404.

URL раздела PHP - comments

En
Section php url (php)