Как получить текущий URL используя PHP
Основные методы работы с адресом страницы
Наиболее универсальный способ получить полный адрес текущей страницы в PHP - это скомбинировать элементы суперглобального массива $_SERVER. Данный подход учитывает протокол, домен, порт и путь с параметрами запроса.
<?php
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$fullUrl = $protocol . '://' . $host . $uri;
echo $fullUrl;
?>
Php проверить ссылку (проверить ссылку в php)
http://example.com/page?key=value
Id ссылки php (идентификатор ссылки в php)
Данное решение подходит для большинства стандартных конфигураций веб-сервера. Оно позволяет получить полный URL, включая query-параметры. Если требуется только путь без query, можно использовать parse_url().
Как извлечь только путь без строки запроса?
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
echo $path;
?>
активная ссылка php (создание активной ссылки в php)
/page
Php ссылки (работа с url и ссылками в php)
Используйте PHP_URL_PATH для получения чистого пути. Цель - получить маршрут для роутинга или логирования.
Как получить только строку запроса (query string)?
<?php
$query = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
echo $query;
?>
Php адрес страницы (адрес страницы в php)
key=value
Php uri (получение uri в php)
Также можно использовать $_SERVER['QUERY_STRING'], но он может отсутствовать, если запрос не содержит параметров. parse_url вернёт null в таком случае.
Как определить имя выполняемого скрипта?
<?php
$scriptName = $_SERVER['SCRIPT_NAME'];
echo $scriptName;
?>
Php page url (url текущей страницы в php)
/index.php
Важно отличать PHP_SELF от SCRIPT_NAME: первый содержит путь к скрипту вместе с возможными дополнительными сегментами при использовании PATH_INFO, второй - только путь к скрипту. Цель - формирование ссылок или определение текущего файла.
Как получить базовый URL сайта (без пути)?
<?php
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$baseUrl = $protocol . '://' . $host . '/';
echo $baseUrl;
?>
http://example.com/
Такой вариант удобен для задания абсолютных путей к статическим ресурсам или для создания редиректов.
Типичные ошибки и способы их устранения
- Неверное определение протокола при использовании прокси. Если сервер стоит за обратным прокси (nginx, haproxy), переменная
$_SERVER['HTTPS']может быть пустой. Решение - проверять заголовокHTTP_X_FORWARDED_PROTOилиHTTP_X_FORWARDED_SSL:
$protocol = 'http'; if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) { $protocol = 'https'; } - XSS-уязвимость при выводе URL. Никогда не выводите полученный URL без экранирования. Используйте
htmlspecialchars()илиfilter_var()сFILTER_SANITIZE_URL. - Неверный порт при нестандартных значениях. Если порт отличается от 80 или 443, его необходимо добавить в URL. Проверяйте
$_SERVER['SERVER_PORT']и добавляйте к хосту, если порт нестандартный. - Различие между REQUEST_URI и PHP_SELF.
REQUEST_URIсодержит всё после домена, включая query.PHP_SELF- путь к скрипту без query, но может содержать PATH_INFO. Выбор зависит от задачи.
Расширенные примеры использования
Функция для получения полного URL с учётом порта и прокси
<?php
function getFullUrl() {
$protocol = 'http';
if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) {
$protocol = 'https';
}
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$port = $_SERVER['SERVER_PORT'] ?? '80';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
// Определяем, нужно ли добавлять порт
$portStr = '';
if (($protocol === 'http' && $port != '80') || ($protocol === 'https' && $port != '443')) {
$portStr = ':' . $port;
}
return $protocol . '://' . $host . $portStr . $uri;
}
echo getFullUrl();
?>
https://example.com:8080/page?q=test
Данная функция обрабатывает нестандартные порты и корректно определяет протокол за обратным прокси.
Получение компонентов URL через parse_url с проверкой
<?php
$url = 'https://user:pass@example.com:8080/path/to/page?name=ferret#anchor';
$parts = parse_url($url);
echo 'Scheme: ' . ($parts['scheme'] ?? 'N/A') . "\n";
echo 'Host: ' . ($parts['host'] ?? 'N/A') . "\n";
echo 'Port: ' . ($parts['port'] ?? 'default') . "\n";
echo 'User: ' . ($parts['user'] ?? 'N/A') . "\n";
echo 'Pass: ' . ($parts['pass'] ?? 'N/A') . "\n";
echo 'Path: ' . ($parts['path'] ?? 'N/A') . "\n";
echo 'Query: ' . ($parts['query'] ?? 'N/A') . "\n";
echo 'Fragment: ' . ($parts['fragment'] ?? 'N/A') . "\n";
?>
Scheme: https Host: example.com Port: 8080 User: user Pass: pass Path: /path/to/page Query: name=ferret Fragment: anchor
Пример демонстрирует разбор произвольного URL на составляющие. Применим для парсинга ссылок из внешних источников.
Получение URL с удалёнными параметрами (без query)
<?php
function urlWithoutParams() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
return $protocol . '://' . $host . ($path ?? '/');
}
echo urlWithoutParams();
?>
http://example.com/page
Полезно для редиректов на ту же страницу без GET-параметров.
Безопасный вывод URL в HTML (экранирование)
<?php
$fullUrl = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$safeUrl = htmlspecialchars($fullUrl, ENT_QUOTES, 'UTF-8');
?>
<a href="<?= $safeUrl ?>">Текущая страница</a>
<a href="http://example.com/page?q=test">Текущая страница</a>
Экранирование предотвращает внедрение вредоносных данных при выводе URL в атрибутах.
Получение адреса страницы из командной строки (CLI)
<?php
if (php_sapi_name() === 'cli') {
$url = $argv[1] ?? 'http://localhost';
} else {
$url = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
echo $url;
?>
При запуске скрипта из консоли переменные $_SERVER не определены, поэтому адрес передаётся аргументом. Данный приём обеспечивает единообразие кода для веб- и CLI-среды.