Обзор способов распознавания текущего 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 "Вы в блоге";
}
Вы в блоге

Определение страницы в PHP - comments

En
определить страницу php (php)