Web

Получение полного URL-адреса в PHP

Я использую этот код для получения полного URL:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

 

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

Мне нужно узнать его таким же, как он отображается на панели навигации в веб-браузере, а не реальный путь к файлу на сервере.

 

Ответ 1

Посмотрите $_SERVER['REQUEST_URI'], т.е.:

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

 

Если же вы хотите поддерживать как HTTP, так и HTTPS, вы можете использовать:

$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http").":// $_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

 

Примечание: использование этого кода имеет последствия для безопасности. Клиент может установить HTTP_HOST и REQUEST_URI на любое произвольное значение.

 

Ответ 2

Краткая версия для вывода ссылки на веб-страницу:

$url =  "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );

echo '<a href="'.$escaped_url.'">'.$escaped_url.'</a>';

 

Полная версия:

function url_origin( $s, $use_forwarded_host = false ) {

    $ssl      = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );

    $sp       = strtolower( $s['SERVER_PROTOCOL'] );

    $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );

    $port     = $s['SERVER_PORT'];

    $port     = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;

    $host     = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );

    $host     = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;

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

}

function full_url( $s, $use_forwarded_host = false ) {

    return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];

}

$absolute_url = full_url( $_SERVER );

echo $absolute_url;

 

Структура URL:

схема: // имя пользователя: пароль @ домен: порт / путь? query_string # fragment_id

Части, выделенные жирным шрифтом, не будут включены в функцию.

 

Заметки:

  • Эта функция не включает username:password полный URL или фрагмент (хэш).

  • Она не будет показывать порт 80 по умолчанию для HTTP и порт 443 для HTTPS.

  • Проверено только со схемами http и https.

  • #fragment_id не отправляется на сервер клиента (браузера) и не будут добавлены к полному URL.

  • $_GET будет содержать только foo=bar2 для URL-адреса, например, /example?foo=bar1&foo=bar2.

  • Некоторые CMS будут перезаписывать $_SERVER['REQUEST_URI'] и возвращать /example?foo=bar2 URL-адрес, например, /example?foo=bar1&foo=bar2$_SERVER['QUERY_STRING'].

  • Имейте в виду, что URI = URL + URN, но из-за популярного использования URL теперь эквиваленты как URI, так и URL.

  • Удалите HTTP_X_FORWARDED_HOST, если не планируете использовать прокси или балансировщики.

  • В спецификации сказано, что Host заголовок должен содержать номер порта, если он не является портом по умолчанию.

 

Переменные, контролируемые клиентом (браузером):

  • $_SERVER['REQUEST_URI']. Любые неподдерживаемые символы кодируются браузером перед отправкой.

  • $_SERVER['HTTP_HOST'] не всегда доступен, согласно комментариям в руководстве по PHP.

  • $_SERVER['HTTP_X_FORWARDED_HOST'] устанавливается балансировщиками и не упоминается в списке $_SERVER переменных в руководстве по PHP.

 

Переменные, контролируемые сервером:

  • $_SERVER['HTTPS']. Клиент выбирает использовать это, но сервер возвращает фактическое значение либо пусто, либо «включено».

  • $_SERVER['SERVER_PORT']. Сервер принимает только разрешенные номера в качестве портов.

  • $_SERVER['SERVER_PROTOCOL']. Сервер принимает только определенные протоколы.

  • $_SERVER['SERVER_NAME']. Это задается вручную в конфигурации сервера и недоступно для IPv6.

 

Ответ 3

function full_path() {

    $s    = &$_SERVER;

    $ssl  = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true : false;

    $sp   = strtolower($s['SERVER_PROTOCOL']);

    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');

    $port = $s['SERVER_PORT'];

    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;

    $host = isset($s['HTTP_X_FORWARDED_HOST']) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);

    $host = isset($host) ? $host : $s['SERVER_NAME'] . $port;

    $uri  = $protocol.'://'.$host.$s['REQUEST_URI'];

    $segments = explode('?', $uri, 2);

    $url  = $segments[0];

    return $url;

}

Схожие статьи

Что такое WebGL и как его включить. Подробная инструкция для чайников
Web

Что такое WebGL и как его включить. Подробная инструкция для чайников

Web

Могу ли я расширить некоторый класс, используя более одного базового класса в PHP

Уязвимости Apache HTTP Server: как их обнаружить и устранить?
Web

Уязвимости Apache HTTP Server: как их обнаружить и устранить?

Список доменов Google: все доменные имена, принадлежащие компании
Web

Список доменов Google: все доменные имена, принадлежащие компании

×