Методы получения URL текущей страницы в PHP
Основные способы получения 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
)