Определение текущей страницы: контекст приложения в 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

Текущая страница в PHP - comments

En
Php текущая страница (php)