Как получить ссылку в PHP: полное руководство
Основные методы получения ссылки в PHP
Как получить полный URL текущей страницы с учетом протокола и хоста?
Наиболее универсальное решение заключается в комбинации $_SERVER['REQUEST_URI'] с протоколом и хостом.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$currentUrl = $protocol . '://' . $host . $uri;получить get php (получение get-параметров в php)
Этот код формирует полный URL, включая путь и строку запроса. Подходит для редиректов, создания канонических ссылок и передачи контекста.
Возможные проблемы: на некоторых серверах $_SERVER['HTTPS'] может быть не задан, тогда лучше проверять $_SERVER['SERVER_PORT'] == 443 или $_SERVER['REQUEST_SCHEME'] (доступно в PHP 7+). Также $_SERVER['HTTP_HOST'] может включать порт (например, example.com:8080), что нужно учитывать.
Как получить только путь без строки запроса?
Для извлечения чистого пути используется функция parse_url().
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);Php получить html (получение html-кода в php)
Это удобно, когда нужно определить текущую страницу без учета параметров (например, для подсветки активного пункта меню).
Ошибка: если $_SERVER['REQUEST_URI'] содержит только слэш, parse_url вернет /. Для скриптов с ЧПУ путь может быть перезаписан (например, через .htaccess), поэтому $_SERVER['REQUEST_URI'] отдаёт запрошенный URL, а не реальный путь к файлу.
Как достать строку запроса (query string) из текущего URL?
Строка запроса доступна через $_SERVER['QUERY_STRING'] или как часть $_SERVER['REQUEST_URI'].
$queryString = $_SERVER['QUERY_STRING'];
// или
$queryString = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
Php получить id (получение id в php)
Если нужно получить разобранные параметры, лучше использовать $_GET. QUERY_STRING даёт сырую строку, что полезно для её модификации.
Типичная ошибка: при использовании $_GET параметры уже декодированы, а QUERY_STRING содержит URL-encoded значения. При работе с многобайтовыми символами нужно быть внимательным.
Как получить имя текущего скрипта (например, index.php)?
Имя исполняемого файла можно получить через $_SERVER['PHP_SELF'] или $_SERVER['SCRIPT_NAME'].
$scriptName = $_SERVER['PHP_SELF'];
$scriptName2 = $_SERVER['SCRIPT_NAME'];получаем url php (получение url в php)
PHP_SELF может содержать путь после имени файла при использовании (например, /dir/index.php/extra), что иногда приводит к неожиданным результатам. SCRIPT_NAME возвращает только путь к скрипту.
Проблема с безопасностью: PHP_SELF может быть подвержен XSS-атакам, если используется в выводе без экранирования. Рекомендуется использовать htmlspecialchars().
Как собрать полный URL с учётом порта и нестандартного протокола?
Для более точного построения URL можно использовать комбинацию $_SERVER['REQUEST_SCHEME'] (PHP 7+), $_SERVER['SERVER_NAME'] и $_SERVER['SERVER_PORT'].
$scheme = $_SERVER['REQUEST_SCHEME'] ?? (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http');
$port = ($scheme === 'https' && $_SERVER['SERVER_PORT'] == 443) || ($scheme === 'http' && $_SERVER['SERVER_PORT'] == 80) ? '' : ':' . $_SERVER['SERVER_PORT'];
$url = $scheme . '://' . $_SERVER['SERVER_NAME'] . $port . $_SERVER['REQUEST_URI'];
Этот подход корректно обрабатывает нестандартные порты и даёт точный URL. Используется при построении внешних ссылок, например, для Open Graph.
Цели и случаи использования
- Редиректы (header Location) - нужен полный URL для перенаправления на ту же страницу с другими параметрами.
- Построение пагинации, сортировки, фильтров - требуется модификация текущего URL.
- Канонические ссылки (link rel="canonical") - для избежания дублирования контента.
- Сохранение состояния страницы в формах (action="").
- Логирование и аналитика - фиксация точного запроса.
Расширенные примеры работы с URL в PHP
Пример 1: Функция для безопасного получения полного URL
Создание универсальной функции, которая возвращает текущий URL с учётом HTTPS, порта и прокси.
function getCurrentUrl() {
$scheme = 'http';
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$scheme = 'https';
} elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
$scheme = 'https';
} elseif (isset($_SERVER['REQUEST_SCHEME'])) {
$scheme = $_SERVER['REQUEST_SCHEME'];
}
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
return $scheme . '://' . $host . $uri;
}
echo getCurrentUrl();
https://example.com/path/to/page?param=value
Пример 2: Изменение параметров в текущем URL
Добавление или замена параметра page в строке запроса без потери остальных.
function addParamToCurrentUrl($key, $value) {
$parsed = parse_url($_SERVER['REQUEST_URI']);
$query = [];
if (isset($parsed['query'])) {
parse_str($parsed['query'], $query);
}
$query[$key] = $value;
$newQuery = http_build_query($query);
$path = $parsed['path'] ?? '/';
return $path . '?' . $newQuery;
}
echo addParamToCurrentUrl('page', 2);
/products?category=books&page=2
Пример 3: Работа с фрагментом (якорем) через JavaScript
Сервер не видит часть URL после #, поэтому её можно получить только на стороне клиента. Пример отправки фрагмента на сервер через AJAX.
// JavaScript (фрагмент кода):
// var hash = window.location.hash.substring(1);
// fetch('/save_hash.php?hash=' + encodeURIComponent(hash));
// PHP (save_hash.php):
$hash = $_GET['hash'] ?? '';
// ... обработка
Такой подход применяется для передачи состояния SPA-приложения.
Пример 4: Проверка валидности URL с помощью filter_var
$url = 'https://example.com/path?q=1#section';
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo 'URL корректен';
} else {
echo 'URL некорректен';
}
URL корректен
Пример 5: Получение базового URL (без path и query)
function getBaseUrl() {
$scheme = ($_SERVER['HTTPS'] ?? 'off') === 'on' ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
return $scheme . '://' . $host;
}
echo getBaseUrl();
https://example.com
Пример 6: Формирование ссылки для пагинации с сохранением существующих параметров
$currentQuery = $_GET;
$currentQuery['page'] = isset($_GET['page']) ? (int)$_GET['page'] + 1 : 2;
$nextPageUrl = '?' . http_build_query($currentQuery);
echo $nextPageUrl;
?category=books&page=2