Определение текущей страницы: контекст приложения в PHP
Основные способы определения текущей страницы
Какой метод является наиболее надёжным для получения имени текущего скрипта?
Наиболее эффективным решением считается использование суперглобального массива $_SERVER['SCRIPT_NAME'] в сочетании с функцией basename(). Этот способ возвращает путь от корня веб-сервера до исполняемого скрипта и не подвержен влиянию пользовательских данных, что исключает возможность инъекции. Для получения только имени файла применяется basename($_SERVER['SCRIPT_NAME']).
$scriptPath = $_SERVER['SCRIPT_NAME'];
// /app/index.php
$scriptName = basename($scriptPath);
// index.php
echo $scriptName;Php текущая страница (текущая страница в php)
Цель: определить, какой файл обрабатывает текущий запрос, чтобы реализовать логику маршрутизации или активное меню. Случаи использования: системы управления контентом, фреймворки, кастомные роутеры.
Проблема: при использовании «красивых» URL через mod_rewrite $_SERVER['SCRIPT_NAME'] может показывать реальный путь к скрипту (например, index.php), а не виртуальный адрес. В таких случаях для контекста приложения подходит комбинация с $_SERVER['REQUEST_URI'].
Как получить имя скрипта вместе с возможными дополнительными сегментами пути?
Переменная $_SERVER['PHP_SELF'] возвращает путь к текущему скрипту относительно корня домена, включая всё, что следует за именем файла в URI (например, /index.php/extra/path). Это удобно для сценариев, где требуется учесть дополнительные аргументы пути, но одновременно создаёт угрозу XSS, если значение выводится без экранирования.
echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8');
Типичная ошибка: вывод значения напрямую без htmlspecialchars приводит к внедрению скриптов, поскольку злоумышленник может передать в URL /index.php/%22%3E%3Cscript%3E...%3C/script%3E. Рекомендуется использовать $_SERVER['SCRIPT_NAME'] вместо $_SERVER['PHP_SELF'] для надёжности.
Как определить полный URL или URI запроса, включая GET-параметры?
$_SERVER['REQUEST_URI'] содержит полный запрос, переданный браузером, включая путь и строку запроса. Это идеальный источник для построения абсолютных ссылок, редиректов или логирования.
$requestUri = $_SERVER['REQUEST_URI'];
// /page?option=value&id=42
Цель: сохранение контекста при перенаправлениях, отслеживание исходного запроса, работа с параметрами. Случаи использования: пагинация, формы обратной связи с сохранением состояния, аналитика.
Проблема: включая строку запроса, $_SERVER['REQUEST_URI'] может содержать символы, которые нуждаются в экранировании при выводе. Кроме того, если требуется только путь без параметров, необходимо использовать parse_url().
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// /page
echo $path;
Как извлечь только путь из URI, удалив GET-параметры?
Функция parse_url() с флагом PHP_URL_PATH позволяет получить чистый путь без строки запроса. Это необходимо, когда логика приложения должна реагировать только на адрес страницы, игнорируя параметры.
$cleanUrl = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// /news/article?page=2 -> /news/article
Цель: маршрутизация, выделение сегментов пути, проверка соответствия шаблону. Случаи использования: разработка собственного роутера, определение активного пункта меню по path.
Ошибка: при передаче невалидного URI функция может вернуть false. Рекомендуется проверять результат перед использованием.
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path === false) {
$path = '/';
}
Как получить абсолютный путь к файлу на сервере, а не URL?
Предопределённая константа __FILE__ возвращает полный путь к исполняемому файлу в файловой системе сервера. Это полезно для операций с файлами (include, require, чтение конфигов), но не подходит для веб-адресов.
$scriptFile = __FILE__;
// /var/www/html/app/index.php
Цель: инклюды относительно текущего файла, логирование с указанием физического пути. Случаи использования: установка путей в конфигурации, отладка, автозагрузка классов.
Обратите внимание: __FILE__ даёт абсолютный путь, который не должен отображаться пользователю по соображениям безопасности. Никогда не выводите его на экран.
Как безопасно получить имя файла без расширения и пути?
Комбинация pathinfo() и $_SERVER['SCRIPT_NAME'] позволяет извлечь имя файла без расширения, путь и расширение отдельно. Это пригодится для создания шаблонов, названий классов или мета-тегов.
$info = pathinfo($_SERVER['SCRIPT_NAME']);
// ['dirname' => '', 'basename' => 'index.php', 'extension' => 'php', 'filename' => 'index']
$pageName = $info['filename']; // index
Цель: динамически формировать содержимое на основании имени страницы (например, подключить шаблон page-index.php). Случаи использования: простые самодельные CMS.
Когда скрипт находится в корне, dirname может быть пустым или содержать точку. Учитывайте это при построении путей.
Расширенные примеры и результаты их выполнения
<?php
// Пример 1: Получение имени файла и пути
$scriptName = basename($_SERVER['SCRIPT_NAME']);
$scriptPath = $_SERVER['SCRIPT_NAME'];
echo 'Имя файла (basename): ' . $scriptName . "\n";
echo 'Путь от корня: ' . $scriptPath . "\n";
// Предположим, URL: http://example.com/app/admin/index.php
// Результат:
?>
Имя файла (basename): index.php Путь от корня: /app/admin/index.php
<?php
// Пример 2: Извлечение чистого пути из REQUEST_URI
$requestUri = $_SERVER['REQUEST_URI'];
// Например, /catalog/items?sort=price&page=2
$cleanPath = parse_url($requestUri, PHP_URL_PATH);
echo 'Исходный URI: ' . $requestUri . "\n";
echo 'Путь без параметров: ' . $cleanPath . "\n";
// Результат:
?>
Исходный URI: /catalog/items?sort=price&page=2 Путь без параметров: /catalog/items
<?php
// Пример 3: Разбор PHP_SELF с экранированием
$self = htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8');
echo 'Безопасный PHP_SELF: ' . $self . "\n";
// Если в URL передано /index.php/%22%3E%3Cscript%3E, то
// результат будет экранирован.
?>
Безопасный PHP_SELF: /index.php/"><script>
<?php
// Пример 4: Использование pathinfo для получения имени без расширения
$info = pathinfo($_SERVER['SCRIPT_NAME']);
$filename = $info['filename'];
$extension = $info['extension'];
echo 'Имя без расширения: ' . $filename . "\n";
echo 'Расширение: ' . $extension . "\n";
// Для /products/details.php результат:
?>
Имя без расширения: details Расширение: php
<?php
// Пример 5: Сравнение __FILE__ и $_SERVER['SCRIPT_NAME']
echo 'Константа __FILE__: ' . __FILE__ . "\n";
echo '$_SERVER["SCRIPT_NAME"]: ' . $_SERVER['SCRIPT_NAME'] . "\n";
// Для скрипта /var/www/html/site/index.php:
// __FILE__: /var/www/html/site/index.php
// SCRIPT_NAME: /site/index.php
?>
Константа __FILE__: /var/www/html/site/index.php $_SERVER["SCRIPT_NAME"]: /site/index.php
<?php
// Пример 6: Получение базового URL приложения (без файла)
$parsedUrl = parse_url($_SERVER['REQUEST_URI']);
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$path = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\');
$baseUrl = "$scheme://$host$path";
echo 'Базовый URL: ' . $baseUrl . "\n";
// Для URL http://example.com/subdir/page.php?x=1 результат:
?>
Базовый URL: http://example.com/subdir