Как получить и показать URL текущей страницы в PHP

Раздел: Веб-разработка на 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().

- Php без html (использование php без html (чистый вывод))
- Show php page (показ страницы в php)
- Var dump php (var_dump - вывод информации о переменной)

Расширенные примеры

Пример 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

Показ URL в PHP - comments

En
Show php url (php)