
При работе с веб-приложениями на PHP часто требуется определить полный адрес текущей страницы: например, для формирования динамических ссылок, перенаправлений или ведения логов. Важно учитывать, что URL состоит не только из доменного имени, но и из протокола (http или https), порта, пути и строки запроса.
В PHP доступ к этим данным обеспечивают суперглобальные переменные $_SERVER. Например, протокол можно вычислить на основе значения $_SERVER[‘HTTPS’], имя хоста получить через $_SERVER[‘HTTP_HOST’], а путь и параметры – из $_SERVER[‘REQUEST_URI’]. Комбинируя эти элементы, можно собрать полный URL без использования сторонних библиотек.
Важно помнить, что при работе за обратным прокси или в условиях нестандартной конфигурации сервера часть переменных может отличаться. В таких случаях имеет смысл проверять наличие $_SERVER[‘HTTP_X_FORWARDED_PROTO’] или аналогичных заголовков. Это позволит корректно определять адрес даже в сложных инфраструктурных сценариях.
Извлечение протокола (http или https) из глобального массива $_SERVER

Определение протокола выполняется через переменную $_SERVER['HTTPS']. Если она установлена и имеет значение 'on' или '1', используется https, иначе – http.
Пример кода:
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
? "https"
: "http";
На серверах с балансировкой или прокси корректное значение может передаваться в $_SERVER['HTTP_X_FORWARDED_PROTO']. В этом случае необходимо добавить проверку:
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
$protocol = $_SERVER['HTTP_X_FORWARDED_PROTO'];
}
Такой подход гарантирует получение корректного протокола даже при работе через CDN или обратный прокси.
Определение имени хоста с помощью $_SERVER[‘HTTP_HOST’]
Переменная $_SERVER[‘HTTP_HOST’] содержит доменное имя, запрошенное клиентом в заголовке Host. Это значение зависит от того, что указано в адресной строке браузера: например, при обращении к https://example.com/page результатом будет example.com, а при переходе по поддомену – sub.example.com.
Пример кода:
<?php
echo $_SERVER['HTTP_HOST'];
?>
Использование HTTP_HOST удобно для динамического формирования абсолютных ссылок, редиректов и указания корректного домена в заголовках. Однако значение может быть подменено, если сервер не настроен должным образом. Для повышения безопасности рекомендуется сверять его с допустимыми доменами или использовать переменную $_SERVER[‘SERVER_NAME’] как дополнительный контроль.
В продакшн-среде важно явно ограничивать список хостов на уровне конфигурации веб-сервера (ServerName, ServerAlias в Apache или server_name в Nginx), чтобы исключить атаки через подмену заголовка Host.
Получение части пути через $_SERVER[‘REQUEST_URI’]
![Получение части пути через $_SERVER['REQUEST_URI']](/wp-content/images8/kak-poluchit-tekushij-url-stranitsi-php-ilttfkd2.jpg)
Переменная $_SERVER['REQUEST_URI'] содержит полный путь вместе со строкой запроса. Для извлечения отдельных частей удобно использовать функции работы со строками.
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)– возвращает путь без параметров.explode('/', trim($path, '/'))– разбивает путь на сегменты для выборки нужного элемента.strpos()иsubstr()– позволяют вручную выделить определённый участок строки.
Пример:
$uri = $_SERVER['REQUEST_URI'];
$path = parse_url($uri, PHP_URL_PATH);
$segments = explode('/', trim($path, '/'));
echo $segments[0]; // первый сегмент пути
Такой метод полезен для реализации роутинга без сторонних библиотек. Достаточно проверить нужный сегмент и выполнить соответствующий код:
switch ($segments[0]) {
case 'blog':
// загрузка блога
break;
case 'profile':
// страница профиля
break;
}
Рекомендуется всегда использовать parse_url(), чтобы исключить влияние query string и получить только путь.
Сборка полного URL вручную из протокола, хоста и пути

Для формирования адреса без вспомогательных функций PHP можно объединить данные из суперглобального массива $_SERVER. Это полезно при необходимости гибко управлять частями URL.
$_SERVER['HTTPS']– определяет использование HTTPS. Если значение равноonили1, протокол будетhttps, иначеhttp.$_SERVER['HTTP_HOST']– возвращает доменное имя и при наличии порт.$_SERVER['REQUEST_URI']– содержит путь и строку запроса.
Пример минимального кода:
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$url = $protocol . "://" . $host . $uri;
echo $url;
При использовании нестандартного порта ($_SERVER['SERVER_PORT']) рекомендуется явно добавлять его в $host, чтобы избежать ошибок при доступе.
- Определите протокол.
- Считайте имя хоста и при необходимости добавьте порт.
- Присоедините URI.
Такой способ позволяет полностью контролировать процесс и легко адаптировать результат для логирования, редиректов или генерации ссылок в динамических сценариях.
Использование $_SERVER[‘HTTPS’] для проверки защищённого соединения
![Использование $_SERVER['HTTPS'] для проверки защищённого соединения](/wp-content/images8/kak-poluchit-tekushij-url-stranitsi-php-r41xf5t7.jpg)
Переменная $_SERVER[‘HTTPS’] фиксирует состояние протокола при обращении к серверу. Если страница открыта по HTTPS, её значение обычно равно ‘on’ или ‘1’, при незащищённом соединении – отсутствует или пустая строка.
Пример корректной проверки:
$isSecure = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off';
Альтернативно для серверов с прокси или балансировщиками полезно дополнительно проверять заголовок $_SERVER[‘SERVER_PORT’] (обычно 443 для HTTPS) или $_SERVER[‘HTTP_X_FORWARDED_PROTO’]. Это важно при работе с CDN или nginx в режиме обратного прокси.
Надёжная комбинация условий:
$isSecure =
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
|| (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
Такой подход исключает ложные результаты и гарантирует корректное определение протокола даже в сложной инфраструктуре.
Работа с URL при наличии порта в $_SERVER[‘SERVER_PORT’]
При формировании полного URL важно учитывать, что в $_SERVER[‘SERVER_PORT’] может храниться нестандартное значение. Например, если сайт работает на 8080 порту, адрес будет http://example.com:8080/, а не просто http://example.com/. Стандартные порты (80 для HTTP и 443 для HTTPS) в URL указывать не требуется.
Для корректной сборки адреса можно использовать проверку значения $_SERVER[‘SERVER_PORT’]:
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$port = $_SERVER['SERVER_PORT'];
$host = $_SERVER['SERVER_NAME'];
if (($scheme === "http" && $port != 80) || ($scheme === "https" && $port != 443)) {
$host .= ":" . $port;
}
$url = $scheme . "://" . $host . $_SERVER['REQUEST_URI'];
echo $url;
Такой подход позволяет избежать лишнего добавления стандартного порта и при этом корректно формировать URL при работе с альтернативными портами.
| Протокол | Порт | Результат |
|---|---|---|
| http | 80 | http://example.com/page |
| https | 443 | https://example.com/page |
| http | 8080 | http://example.com:8080/page |
| https | 8443 | https://example.com:8443/page |
Создание вспомогательной функции для получения текущего URL

Для упрощения работы с URL удобно вынести логику в отдельную функцию. Это позволит избежать дублирования кода и упростит поддержку проекта.
Пример универсальной функции:
function getCurrentUrl(): string {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = $_SERVER['HTTP_HOST'] ?? '';
$uri = $_SERVER['REQUEST_URI'] ?? '';
return $protocol . "://" . $host . $uri;
}
Функция определяет протокол с учетом HTTPS, использует `HTTP_HOST` для домена и `REQUEST_URI` для запроса. В результате возвращается полный адрес, включая параметры.
Рекомендуется вызывать эту функцию только в контексте HTTP-запроса. Для CLI-скриптов значения в `$_SERVER` могут отсутствовать, поэтому стоит предусмотреть обработку таких случаев.
Вопрос-ответ:
Почему недостаточно использовать только `$_SERVER[‘REQUEST_URI’]`?
`$_SERVER[‘REQUEST_URI’]` возвращает лишь часть адреса после доменного имени, например: `/page.php?id=5`. Без протокола и домена это не полный URL. Поэтому для получения всего адреса нужно объединять несколько переменных сервера.
Можно ли получить текущий URL без учёта параметров запроса?
Да, можно. Вместо `$_SERVER[‘REQUEST_URI’]` используйте `$_SERVER[‘SCRIPT_NAME’]` или `$_SERVER[‘PHP_SELF’]`. Они вернут путь к исполняемому скрипту, например `/page.php`. Если параметры (`?id=5`) не нужны, просто не добавляйте их при формировании строки.
Есть ли разница между использованием `$_SERVER[‘PHP_SELF’]` и `$_SERVER[‘SCRIPT_NAME’]`?
Да, разница есть. `$_SERVER[‘PHP_SELF’]` показывает путь к файлу относительно корня веб-сервера и зависит от того, как был вызван скрипт. В некоторых случаях он может содержать дополнительные элементы. `$_SERVER[‘SCRIPT_NAME’]` чаще даёт более предсказуемый результат, так как всегда возвращает имя исполняемого файла. Поэтому в большинстве случаев лучше использовать `SCRIPT_NAME`.
