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

Как получить текущий url страницы php

Как получить текущий url страницы php

При работе с веб-приложениями на PHP часто требуется определить полный адрес текущей страницы: например, для формирования динамических ссылок, перенаправлений или ведения логов. Важно учитывать, что URL состоит не только из доменного имени, но и из протокола (http или https), порта, пути и строки запроса.

В PHP доступ к этим данным обеспечивают суперглобальные переменные $_SERVER. Например, протокол можно вычислить на основе значения $_SERVER[‘HTTPS’], имя хоста получить через $_SERVER[‘HTTP_HOST’], а путь и параметры – из $_SERVER[‘REQUEST_URI’]. Комбинируя эти элементы, можно собрать полный URL без использования сторонних библиотек.

Важно помнить, что при работе за обратным прокси или в условиях нестандартной конфигурации сервера часть переменных может отличаться. В таких случаях имеет смысл проверять наличие $_SERVER[‘HTTP_X_FORWARDED_PROTO’] или аналогичных заголовков. Это позволит корректно определять адрес даже в сложных инфраструктурных сценариях.

Извлечение протокола (http или https) из глобального массива $_SERVER

Извлечение протокола (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']

Переменная $_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 вручную из протокола, хоста и пути

Сборка полного 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, чтобы избежать ошибок при доступе.

  1. Определите протокол.
  2. Считайте имя хоста и при необходимости добавьте порт.
  3. Присоедините URI.

Такой способ позволяет полностью контролировать процесс и легко адаптировать результат для логирования, редиректов или генерации ссылок в динамических сценариях.

Использование $_SERVER[‘HTTPS’] для проверки защищённого соединения

Использование $_SERVER['HTTPS'] для проверки защищённого соединения

Переменная $_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

Для упрощения работы с 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`.

Ссылка на основную публикацию