Как получить текущий URL используя PHP

Раздел: Работа с HTTP -> Работа с URL

Основные методы работы с адресом страницы

Наиболее универсальный способ получить полный адрес текущей страницы в 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-среды.

Адрес страницы в PHP - comments

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