Обзор способов распознавания текущего PHP-скрипта
Определение текущей страницы в PHP
При разработке веб-приложений часто требуется узнать, какой скрипт или маршрут выполняется в данный момент. Это необходимо для подсветки активного пункта меню, обработки форм, построения ЧПУ или логирования. В PHP существует несколько подходов, каждый из которых подходит для конкретной задачи.
Наиболее эффективное решение: комбинация $_SERVER['SCRIPT_NAME'] и parse_url
Базовая задача - получить чистый путь к текущему скрипту относительно корня домена, без учёта GET-параметров и возможного переопределения через RewriteRule. Решение:
$cleanPath = parse_url($_SERVER['SCRIPT_NAME'], PHP_URL_PATH);определить страницу php (определение страницы в php)
Этот способ работает в подавляющем большинстве настроек веб-сервера (Apache, Nginx, IIS) и не подвержен XSS-уязвимостям, в отличие от $_SERVER['PHP_SELF']. $_SERVER['SCRIPT_NAME'] содержит виртуальный путь к скрипту, заданный сервером, а parse_url удаляет возможные фрагменты строки запроса, если вдруг веб-сервер добавит их.
Проблема: при использовании $_SERVER['SCRIPT_NAME'] в средах с модулем rewrite может возвращаться первоначальный путь, а не переписанный. Решение: если требуется именно переписанный URI, используйте $_SERVER['REQUEST_URI'] с дополнительной очисткой от query string.
Цель: получить стабильный идентификатор страницы для логики приложения, поиска в массиве маршрутов, скрытого ввода полей формы.
Как получить полный URL запроса без домена?
Используйте $_SERVER['REQUEST_URI']. Этот элемент суперглобального массива содержит путь, переданный клиентом, включая GET-параметры.
$requestUri = $_SERVER['REQUEST_URI'];
Пример: если браузер запросил https://example.com/page?id=1, то $requestUri будет равен /page?id=1.
Ошибка: вывод $_SERVER['REQUEST_URI'] напрямую без экранирования в HTML может привести к XSS. Всегда применяйте htmlspecialchars().
Случаи использования: маршрутизация, анализ входящего запроса, построение канонических ссылок.
Как извлечь имя файла скрипта без пути и расширения?
Функция basename() с __FILE__ или $_SERVER['SCRIPT_FILENAME'].
$scriptName = basename(__FILE__, '.php');
Второй аргумент удаляет расширение. Результат: для файла /var/www/html/index.php получим index.
Проблема: если один и тот же файл вызывается через разные URL (например, с помощью mod_rewrite), basename(__FILE__) всегда выдаёт одно и то же имя. Это не подходит для маршрутизации.
Решение: использовать вместе с $_SERVER['SCRIPT_NAME'], если нужно различать виртуальные пути.
Цель: идентификация включаемого файла или шаблона.
Как разобрать путь на составные части (директория, имя, расширение)?
Функция pathinfo().
$info = pathinfo($_SERVER['SCRIPT_NAME']);
// $info['dirname'] = '/catalog';
// $info['basename'] = 'product.php';
// $info['extension'] = 'php';
// $info['filename'] = 'product';
Ошибка: pathinfo() не обрабатывает query string. Если передать $_SERVER['REQUEST_URI'], то basename может включать параметры. Решение: предварительно отсекать параметры через parse_url().
Случаи: построение хлебных крошек, определение типа страницы.
Как определить, является ли текущая страница главной?
Сравнить путь с корнем.
$current = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$isHome = ($current == '/' || $current == '/index.php');
Проблема: пути '/index.php' и '/' могут быть эквивалентны, но сервер может перенаправлять с одного на другой. Учитывайте настройки сервера.
Решение: нормализовать путь, убирая 'index.php' в конце.
Как использовать константы __DIR__ и __FILE__ для определения расположения?
__DIR__ возвращает директорию текущего файла, __FILE__ - полный путь. Это полезно для include-логики.
echo __FILE__; // /var/www/html/admin/index.php
echo __DIR__; // /var/www/html/admin
Проблема: при использовании в подключаемых файлах (include) __FILE__ всегда относится к файлу, где объявлена константа, а не к точке входа. Это путает новичков.
Решение: для получения пути корневого скрипта используйте $_SERVER['SCRIPT_FILENAME'].
Случаи: создание абсолютных путей для инклудов, работа с файловой системой.
Расширенные примеры определения страницы
1. Нормализация URI и извлечение чистого пути
Задача: получить путь без query string и без двойных слешей.
$uri = $_SERVER['REQUEST_URI'];
$cleanPath = preg_replace('#/{2,}#', '/', parse_url($uri, PHP_URL_PATH));
// Пример: '/catalog//item?' -> '/catalog/item'
Результат: /catalog/item
2. Подсветка активного пункта меню
Используем массив страниц и сравниваем с текущим путём.
$pages = [
'home' => '/',
'about' => '/about',
'contact' => '/contact'
];
$current = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
foreach ($pages as $name => $url) {
$active = ($current == $url) ? ' class="active"' : '';
echo "<a href='$url'$active>$name</a>\n";
}
(вывод: ссылки, у соответствующей страницы атрибут class="active")
3. Маршрутизация с параметрами из URI
Разбиваем URI на сегменты и извлекаем идентификатор.
$path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$segments = explode('/', $path);
// Пример: '/product/42' -> ['product', '42']
if (count($segments) >= 2 && $segments[0] == 'product') {
$productId = (int)$segments[1];
echo "Просмотр товара ID: $productId";
}
Просмотр товара ID: 42
4. Получение имени скрипта для логирования
Комбинируем $_SERVER['SCRIPT_FILENAME'] и basename.
$entry = basename($_SERVER['SCRIPT_FILENAME']);
error_log("Запрос к: $entry");
(в файл логов пишется, например, "Запрос к: index.php")
5. Получение текущей страницы с учётом HTTPS и порта
Для построения абсолютной ссылки.
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$fullUrl = "$scheme://$host$uri";
echo $fullUrl;
https://example.com/catalog/item?id=1
6. Проверка принадлежности к поддиректории
Определить, находится ли текущая страница в разделе 'blog'.
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if (strpos($path, '/blog') === 0) {
echo "Вы в блоге";
}
Вы в блоге