Как получить и показать URL текущей страницы в PHP
Методы вывода URL в PHP
Наиболее эффективное решение: использование суперглобального массива $_SERVER['REQUEST_URI'] с обязательной обработкой через htmlspecialchars(). Этот способ возвращает путь запроса и строку параметров (например, /page.php?id=10), но не протокол и домен. Подходит для отображения текущего адреса внутри сайта.
$url = htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES, 'UTF-8');
echo $url;
Php данные из бд (получение данных из базы данных php)
Цель: получить динамическую часть URL для вставки в атрибуты href или вывода в теле страницы.
Проблемы: прямое использование $_SERVER['REQUEST_URI'] без фильтрации приводит к XSS-уязвимости, так как злоумышленник может подставить вредоносный скрипт в URL. Решение: всегда применять htmlspecialchars() с указанием кодировки. Также стоит учитывать, что значение может быть пустым или некорректным при определённых настройках сервера.
Как сформировать полный абсолютный URL (с протоколом и доменом)?
Цель: получить адрес, пригодный для передачи в email или внешние сервисы. Используется комбинация $_SERVER['HTTPS'], $_SERVER['HTTP_HOST'] и $_SERVER['REQUEST_URI'].
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$path = $_SERVER['REQUEST_URI'];
$fullUrl = $protocol . '://' . $host . $path;
echo htmlspecialchars($fullUrl, ENT_QUOTES, 'UTF-8');
Shows php name (показ имени в php)
Типичные ошибки: не учитывается порт (например, 8080), который может отсутствовать в HTTP_HOST. Если сервер стоит за обратным прокси, переменные могут быть подменены. Решение: для продакшена лучше доверять только настроенным заголовкам X-Forwarded-Proto и X-Forwarded-Host.
Как получить только путь без параметров (для action формы)?
Цель: использовать путь к текущему скрипту в атрибуте action тега form. Подходит $_SERVER['PHP_SELF'] или $_SERVER['SCRIPT_NAME'].
$action = htmlspecialchars($_SERVER['SCRIPT_NAME'], ENT_QUOTES, 'UTF-8');
echo '<form method="post" action="' . $action . '">';
вывод mysql php (вывод данных из mysql в php)
SCRIPT_NAME надёжнее, так как не изменяется правилами перезаписи (mod_rewrite). PHP_SELF может быть обманут через добавление /path в URL.
Проблемы: если скрипт вызывается через симлинк или виртуальный хост, значения могут быть неожиданными. Решение: всегда использовать SCRIPT_NAME и экранирование.
Как разобрать URL на компоненты (схема, хост, путь, параметры)?
Цель: программно извлечь отдельные части URL, например, для изменения параметров. Используется функция parse_url().
$url = 'https://example.com/path/page.php?name=value#frag';
$parsed = parse_url($url);
print_r($parsed);
Show php url (показ url в php)
Типичные ошибки: parse_url() не проверяет корректность URL, а только разбирает строку. При отсутствии схемы элемент 'scheme' будет пустым. Решение: перед разбором убедиться, что строка содержит допустимый URL, или использовать filter_var().
Как собрать URL из массива частей?
Цель: сформировать URL программно, например, для генерации ссылок. В стандартной библиотеке PHP нет аналога, но можно использовать http_build_url() (доступен в PECL) или написать собственную функцию.
// Пример с PECL http_build_url
$parts = [
'scheme' => 'https',
'host' => 'example.com',
'path' => '/search',
'query' => 'q=php'
];
$url = http_build_url($parts);
echo $url;
Show form php (показ формы в php)
Проблемы: функция http_build_url() не входит в стандартную поставку PHP. Для проектов без PECL приходится реализовывать сборку вручную, учитывая экранирование символов. Решение: использовать http_build_query() для строки запроса и склеивать части через оператор точки.
Как проверить, что строка является корректным URL, перед выводом?
Цель: избежать вывода мусора или вредоносных данных. Используется filter_var() с константой FILTER_VALIDATE_URL.
$input = 'https://example.com';
if (filter_var($input, FILTER_VALIDATE_URL)) {
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
} else {
echo 'Некорректный URL';
}
Типичные ошибки: FILTER_VALIDATE_URL не проверяет доступность ресурса, только синтаксис. Он может отклонить корректные IDN-адреса с кириллицей. Решение: для работы с национальными доменами предварительно конвертировать через idn_to_ascii().
Расширенные примеры
Пример 1: Получение полного URL с учётом порта и безопасное отображение.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$port = $_SERVER['SERVER_PORT'];
$host = $_SERVER['HTTP_HOST'];
// Если порт нестандартный, добавляем его
$full = $protocol . '://' . $host . ($port != 80 && $port != 443 ? ':' . $port : '') . $_SERVER['REQUEST_URI'];
echo htmlspecialchars($full, ENT_QUOTES, 'UTF-8');
Результат при запросе https://example.com:8080/page.php?a=1: https://example.com:8080/page.php?a=1
Пример 2: Разбор URL и вывод каждого компонента.
$url = 'http://user:pass@site.com:8080/path?q=term#sec';
$parts = parse_url($url);
echo 'Схема: ' . ($parts['scheme'] ?? 'не указана') . PHP_EOL;
echo 'Хост: ' . ($parts['host'] ?? 'не указан') . PHP_EOL;
echo 'Порт: ' . ($parts['port'] ?? 'по умолчанию') . PHP_EOL;
echo 'Путь: ' . ($parts['path'] ?? 'не указан') . PHP_EOL;
echo 'Параметры: ' . ($parts['query'] ?? 'отсутствуют') . PHP_EOL;
echo 'Якорь: ' . ($parts['fragment'] ?? 'отсутствует') . PHP_EOL;
Схема: http Хост: site.com Порт: 8080 Путь: /path Параметры: q=term Якорь: sec
Пример 3: Сборка URL из частей без PECL.
function buildUrl(array $parts): string {
$url = ($parts['scheme'] ?? 'http') . '://';
if (!empty($parts['user'])) {
$url .= $parts['user'];
if (!empty($parts['pass'])) {
$url .= ':' . $parts['pass'];
}
$url .= '@';
}
$url .= $parts['host'] ?? 'localhost';
if (!empty($parts['port'])) {
$url .= ':' . $parts['port'];
}
$url .= $parts['path'] ?? '/';
if (!empty($parts['query'])) {
$url .= '?' . $parts['query'];
}
if (!empty($parts['fragment'])) {
$url .= '#' . $parts['fragment'];
}
return $url;
}
$components = [
'scheme' => 'https',
'host' => 'api.example.com',
'path' => '/v1/users',
'query' => http_build_query(['id' => 55, 'active' => true])
];
echo buildUrl($components);
https://api.example.com/v1/users?id=55&active=1
Пример 4: Получение базового URL (схема + домен) для построения относительных ссылок.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$baseUrl = $protocol . '://' . $_SERVER['HTTP_HOST'];
echo htmlspecialchars($baseUrl, ENT_QUOTES, 'UTF-8');
https://example.com
Пример 5: Безопасный вывод URL из внешнего источника (например, из базы данных) с проверкой.
$externalUrl = 'https://phptest.com/<script>alert(1)</script>';
if (filter_var($externalUrl, FILTER_VALIDATE_URL)) {
echo 'Ссылка: ' . htmlspecialchars($externalUrl, ENT_QUOTES, 'UTF-8');
} else {
echo 'Ссылка не прошла проверку';
}
// Результат: ссылка не прошла проверку, так как содержит теги
Ссылка не прошла проверку
Пример 6: Использование pathinfo() для получения имени файла из URL.
$url = '/blog/article.php?id=10';
$path = parse_url($url, PHP_URL_PATH);
$info = pathinfo($path);
echo 'Имя файла: ' . $info['basename'];
echo 'Расширение: ' . ($info['extension'] ?? 'нет');
Имя файла: article.php Расширение: php