
В PHP существует несколько надежных методов для извлечения полного URL текущей страницы. Основной способ – использование суперглобального массива $_SERVER, который хранит информацию о протоколе, хосте и пути запроса. Комбинация $_SERVER[‘HTTPS’], $_SERVER[‘HTTP_HOST’] и $_SERVER[‘REQUEST_URI’] позволяет собрать точный адрес без сторонних библиотек.
Для динамических проектов важно учитывать наличие прокси и корректно определять протокол. Если сайт работает через HTTPS или перенаправляется через прокси, рекомендуется проверять $_SERVER[‘HTTP_X_FORWARDED_PROTO’] или $_SERVER[‘HTTP_X_FORWARDED_SSL’], чтобы избежать ошибок при формировании URL. Это особенно критично для сайтов с несколькими поддоменами.
Для упрощения повторного использования URL удобно создавать небольшую функцию, которая автоматически собирает протокол, домен и путь запроса. Такая функция позволяет не дублировать код в разных частях проекта и уменьшает вероятность ошибок при генерации ссылок в API или при редиректах.
Определение полного URL текущей страницы через $_SERVER
Для точного получения полного URL текущей страницы в PHP используется массив $_SERVER. Основные элементы, необходимые для сборки URL:
$_SERVER['HTTPS'] – проверяет протокол HTTPS. Если значение равно ‘on’, протокол будет ‘https’, иначе ‘http’.
$_SERVER['HTTP_HOST'] – содержит доменное имя сервера с портом, если он нестандартный.
$_SERVER['REQUEST_URI'] – включает путь и строку запроса после домена, например /folder/page.php?param=value.
Пример корректного формирования полного URL:
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
$full_url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
Этот способ учитывает как протокол, так и любые параметры запроса, включая GET-параметры. Он подходит для динамических и статических страниц.
Важно: если сайт использует нестандартный порт (например, 8080), убедитесь, что $_SERVER['HTTP_HOST'] содержит порт. В противном случае его нужно добавить вручную через $_SERVER['SERVER_PORT'].
Для дополнительной безопасности при генерации URL следует фильтровать значения через filter_var($full_url, FILTER_SANITIZE_URL), чтобы избежать внедрения вредоносных данных в адрес.
Получение домена сайта без протокола в PHP

Для извлечения домена без протокола в PHP чаще всего используют глобальный массив $_SERVER. Наиболее точный способ – опираться на HTTP_HOST:
Пример:
$domain = $_SERVER['HTTP_HOST']; echo $domain; // example.com
Если требуется удалить поддомены или получить только основной домен второго уровня с зоной, можно использовать функцию parse_url вместе с preg_replace:
$url = 'https://sub.example.com/path';
$host = parse_url($url, PHP_URL_HOST);
$domain = preg_replace('/^www\./', '', $host);
echo $domain; // sub.example.com
Для универсального решения без учета протокола и поддоменов удобно использовать explode и array_slice:
$host = $_SERVER['HTTP_HOST'];
$parts = explode('.', $host);
$domain = implode('.', array_slice($parts, -2));
echo $domain; // example.com
Этот метод работает с доменами второго уровня и доменами с расширенными зонами, например example.co.uk, если правильно настроить array_slice для нужной глубины.
Для проектов с динамическими поддоменами рекомендуется проверять наличие www и корректно обрабатывать разные структуры URL, чтобы избежать ошибок при генерации ссылок или редиректах.
Формирование URL с учетом порта и протокола

При формировании полного URL в PHP важно учитывать не только домен и путь, но и протокол (HTTP или HTTPS) и порт сервера. Некорректная комбинация этих элементов может привести к недоступности ресурсов или ошибкам перенаправления.
Основные шаги для точного формирования URL:
- Определение протокола:
Используйте проверку переменной
$_SERVER['HTTPS']для выявления защищенного соединения:$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
- Получение хоста:
Используйте
$_SERVER['HTTP_HOST'], чтобы автоматически учесть поддомены и текущий домен:$host = $_SERVER['HTTP_HOST'];
- Учет порта:
Если сервер использует нестандартный порт, его необходимо добавить вручную. Стандартные порты 80 для HTTP и 443 для HTTPS можно опускать:
$port = $_SERVER['SERVER_PORT']; if (($protocol === 'http' && $port != 80) || ($protocol === 'https' && $port != 443)) { $host .= ':' . $port; } - Формирование полного URL:
Объедините протокол, хост с портом и путь к скрипту:
$url = $protocol . '://' . $host . $_SERVER['REQUEST_URI'];
Рекомендации:
- Используйте
$_SERVER['REQUEST_URI']вместо$_SERVER['PHP_SELF'], чтобы включить GET-параметры. - При работе за прокси проверяйте
$_SERVER['HTTP_X_FORWARDED_PROTO'], чтобы корректно определить протокол HTTPS. - Для генерации URL в CLI или при тестировании используйте переменные окружения или конфигурационные значения вместо
$_SERVER.
Извлечение запроса (query string) из URL

Для получения query string в PHP используется глобальная переменная $_SERVER['QUERY_STRING']. Она возвращает строку запроса без символа ?, содержащую все параметры URL после пути.
Пример извлечения строки запроса:
<?php
$query = $_SERVER['QUERY_STRING'];
echo $query;
?>
Для удобной работы с отдельными параметрами используется функция parse_str(). Она преобразует строку запроса в массив ключ-значение.
<?php
$query = $_SERVER['QUERY_STRING'];
parse_str($query, $params);
print_r($params);
?>
Результат выполнения кода для URL https://example.com/page.php?id=10&category=books:
| Ключ | Значение |
|---|---|
| id | 10 |
| category | books |
Если требуется получить значение конкретного параметра без обработки всех остальных, можно использовать $_GET:
<?php
$id = $_GET['id']; // вернет 10
$category = $_GET['category']; // вернет 'books'
?>
Для безопасности рекомендуется использовать filter_input() для валидации и фильтрации данных из строки запроса:
<?php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$category = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING);
?>
Этот подход предотвращает внедрение нежелательных символов и обеспечивает корректное использование параметров в приложении.
Сбор URL для редиректа внутри PHP

Для формирования корректного URL редиректа используйте протокол, хост и путь запроса. Определение протокола выполняется через проверку $_SERVER[‘HTTPS’]:
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
Домен и путь запроса собираются из $_SERVER[‘HTTP_HOST’] и $_SERVER[‘REQUEST_URI’]:
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$currentUrl = $protocol . $host . $uri;
Для редиректа с параметрами GET формируйте строку запроса через http_build_query():
$params = ['page' => 3, 'sort' => 'asc'];
$query = http_build_query($params);
$redirectUrl = $protocol . $host . '/destination.php?' . $query;
Редирект выполняется функцией header() с завершением скрипта через exit:
header('Location: ' . $redirectUrl);
exit;
Для безопасности используйте filter_var() или urlencode() для экранирования домена и параметров:
$safeHost = filter_var($host, FILTER_SANITIZE_URL);
$safeRedirect = $protocol . $safeHost . '/destination.php?' . http_build_query($params);
Такой метод обеспечивает точное формирование URL и корректное выполнение редиректа внутри PHP.
Использование функции parse_url для разбора URL

Функция parse_url позволяет извлечь отдельные компоненты URL: схему, хост, порт, путь, строку запроса и фрагмент. Это особенно удобно, когда требуется обработка адресов динамически или проверка их корректности.
Синтаксис функции:
parse_url(string $url, int $component = -1): array|string|false- $url – строка с URL.
- $component – необязательный параметр, позволяет сразу получить конкретную часть URL (например, PHP_URL_HOST, PHP_URL_PATH).
Пример извлечения всех компонентов URL:
$url = "https://example.com:8080/path/page.php?user=1#section";
$parts = parse_url($url);
print_r($parts);
Результат:
Array
(
[scheme] => https
[host] => example.com
[port] => 8080
[path] => /path/page.php
[query] => user=1
[fragment] => section
)
Если нужно получить только хост или путь, можно использовать второй параметр:
$host = parse_url($url, PHP_URL_HOST); // "example.com"
$path = parse_url($url, PHP_URL_PATH); // "/path/page.php"
Рекомендации по использованию:
- Всегда проверяйте результат на
false, чтобы избежать ошибок при некорректных URL. - Для обработки GET-параметров после извлечения
queryиспользуйтеparse_str. - Для построения URL после изменений компонентов применяйте конкатенацию или специализированные функции, так как
parse_urlвозвращает только разбор, а не сборку URL.
Пример совместного использования parse_url и parse_str:
$url = "https://example.com/page.php?user=1&action=edit";
$parts = parse_url($url);
parse_str($parts['query'], $queryParams);
print_r($queryParams);
Результат:
Array
(
[user] => 1
[action] => edit
)
Функция parse_url подходит для быстрого анализа URL и безопасного извлечения отдельных компонентов без использования регулярных выражений.
