Методы получения URL текущей страницы в PHP

Раздел: Разработка на PHP -> Работа с URL

Основные способы получения URL текущей страницы

Как получить полный URL страницы с учётом протокола, хоста и порта?

Наиболее надёжный и часто используемый способ - собрать URL из элементов суперглобального массива $_SERVER. Этот метод работает на большинстве серверов (Apache, Nginx) и учитывает как HTTP, так и HTTPS.


if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
    $protocol = 'https';
} else {
    $protocol = 'http';
}

$url = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
echo $url;
  

Php проверить ссылку (проверить ссылку в php)

Пояснение: проверяется наличие и значение ключа HTTPS; если он включён, протокол устанавливается как https, иначе http. Затем собирается строка с использованием HTTP_HOST (содержит домен и, если нестандартный, порт) и REQUEST_URI (путь и строка запроса).

Типичная ошибка: на некоторых серверах (особенно при использовании FastCGI) переменная $_SERVER['HTTPS'] может быть не установлена или иметь значение off. В таких случаях протокол определяется неверно. Решение: дополнительно проверять переменную $_SERVER['SERVER_PORT'] (443 для HTTPS).


$port = $_SERVER['SERVER_PORT'] ?? 80;
$protocol = ($port == 443) ? 'https' : 'http';
    

Id ссылки php (идентификатор ссылки в php)

Как получить URL без указания порта, если он стандартный?

Иногда требуется избавиться от порта в результирующем URL для единообразия. Для этого используется $_SERVER['SERVER_NAME'] вместо HTTP_HOST.


$url = $protocol . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  

активная ссылка php (создание активной ссылки в php)

Особенность: SERVER_NAME содержит только имя хоста без порта. Если порт нестандартный, он теряется, что может быть некорректно для приложения.

Как получить URL с использованием SCRIPT_URI?

Некоторые серверы (например, Apache с mod_rewrite) предоставляют переменную $_SERVER['SCRIPT_URI'], которая уже содержит полный URL текущего скрипта. Этот вариант прост, но не всегда доступен.


if (isset($_SERVER['SCRIPT_URI'])) {
    $url = $_SERVER['SCRIPT_URI'];
} else {
    // альтернативная сборка
}
  

Php ссылки (работа с url и ссылками в php)

Проблема: переменная может содержать путь к физическому файлу скрипта, а не виртуальный URL после рерайтинга. Поэтому использовать её стоит с осторожностью.

Типичная ошибка при использовании $_SERVER['REQUEST_URI']: при передаче кириллических символов в строке запроса браузер может отправлять как URL-encoded, так и raw-строку. REQUEST_URI часто содержит уже закодированные символы (например, %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82). Перед выводом для пользователя требуется декодирование через urldecode().


$decoded_url = urldecode($url);
    

Php адрес страницы (адрес страницы в php)

Как получить только путь и строку запроса без протокола и хоста?

Достаточно использовать $_SERVER['REQUEST_URI'] напрямую.


$relative_url = $_SERVER['REQUEST_URI']; // например, /page?id=123
  

Php uri (получение uri в php)

Как получить URL с учётом подкаталогов и виртуальных путей?

Комбинация $_SERVER['HTTP_HOST'] и $_SERVER['REQUEST_URI'] автоматически включает все части пути. Если нужно получить физический путь до скрипта, используется $_SERVER['SCRIPT_FILENAME'].


// физический путь на сервере
$fs_path = $_SERVER['SCRIPT_FILENAME'];
  

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

Ниже приведены различные сценарии получения URL с детальным разбором кода и ожидаемым результатом.

Пример 1. Функция для получения полного URL (с портом и без)

Пример

function getCurrentUrl($includePort = false) {
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    $host = $includePort ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
    $uri = $_SERVER['REQUEST_URI'];
    return $protocol . '://' . $host . $uri;
}

// Вызовы
echo getCurrentUrl(true);  // с портом, если нестандартный
echo getCurrentUrl(false); // без порта
Результат (для страницы http://example.com:8080/test?id=1):
http://example.com:8080/test?id=1
http://example.com/test?id=1

Пример 2. Обработка строки запроса отдельно

Пример

$queryString = $_SERVER['QUERY_STRING'] ?? ''; // строка запроса без вопроса
echo $queryString;
// Результат: id=1&page=2

// Если нужно получить полный URL, но без параметров:
$urlWithoutQuery = strtok($_SERVER['REQUEST_URI'], '?');
// Или через explode
list($path) = explode('?', $_SERVER['REQUEST_URI'], 2);
Для REQUEST_URI = /test?id=1&page=2
$path = '/test'
$queryString = 'id=1&page=2'

Пример 3. Использование filter_var для валидации собранного URL

Пример

$url = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL корректен: $url";
} else {
    echo "Ошибка в сборке URL";
}
Результат: URL корректен: http://example.com/test?id=1 (если всё верно)

Пример 4. Универсальная функция с учётом прокси (например, при работе с балансировщиками)

Пример

function getRealUrl() {
    // Проверка заголовков X-Forwarded-* (используйте с осторожностью)
    $protocol = 'http';
    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $protocol = 'https';
    } elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
        $protocol = 'https';
    }

    $host = $_SERVER['HTTP_X_FORWARDED_HOST'] ?? $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
    $uri = $_SERVER['REQUEST_URI'];

    return $protocol . '://' . $host . $uri;
}

echo getRealUrl();
Результат: если прокси передаёт https, получим https://realdomain.com/...

Пример 5. Разбор URL на части с помощью parse_url

Пример

$url = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$parts = parse_url($url);
print_r($parts);
Array
(
    [scheme] => http
    [host] => example.com
    [port] => 8080
    [path] => /test
    [query] => id=1
)

URL текущей страницы в PHP - comments

En
Php page url (php)