9

Получить полный URL в PHP

7

Проблема с получением полного URL в PHP с учётом масок в .htaccess

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

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

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

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

Как мне получить полный URL, включая любые маски и редиректы, которые применяются в .htaccess?

5 ответ(ов)

2

Привет! На вопрос о разборе URL https://www.site.xyz/fold/my.php?var=bla#555, можно ответить следующим образом:

Уведомление 1:

  • Часть с хешем # была добавлена вручную в приведённых ниже примерах кода PHP только для теоретических и иллюстративных целей. Однако серверные языки (включая PHP) не могут обнаружить эту часть, так как хеш-части распознаются только на стороне клиента, в браузере/JavaScript.

Уведомление 2:

  • Константа DIRECTORY_SEPARATOR возвращает \ для Windows, тогда как для UNIX-систем возвращается /.
========== PATHINFO (используйте для файловых путей, а не для URL) ==========

$x = PATHINFO ($url);
$x['dirname']              🡺 https://www.site.xyz/fold
$x['basename']             🡺                           my.php?var=bla#555 // ненадёжно!
$x['extension']            🡺                              php?var=bla#555 // ненадёжно!
$x['filename']             🡺                           my

========== PARSE_URL (используйте для URL, а не для файловых путей) ==========

$x = PARSE_URL ($url);
$x['scheme']               🡺 https
$x['host']                 🡺         www.site.xyz
$x['path']                 🡺                     /fold/my.php
$x['query']                🡺                                  var=bla
$x['fragment']             🡺                                          555

Глобальные переменные $_SERVER

$_SERVER["DOCUMENT_ROOT"]  🡺 /home/user/public_html
$_SERVER["SERVER_ADDR"]    🡺 143.34.112.23
$_SERVER["SERVER_PORT"]    🡺 80 (или 443 и т.д.)
$_SERVER["REQUEST_SCHEME"] 🡺 https                           
$_SERVER["SERVER_PROTOCOL"]🡺 <та же>
$_SERVER['HTTP_HOST']      🡺        www.site.xyz
$_SERVER["SERVER_NAME"]    🡺           <та же>
$_SERVER["REQUEST_URI"]    🡺                    /fold/my.php?var=bla
$_SERVER["QUERY_STRING"]   🡺                                 var=bla

__FILE__                   🡺 /home/user/public_html/fold/my.php
$_SERVER["SCRIPT_FILENAME"]🡺 <та же>                              // Примечание! Показан путь к исходному файлу, если `my.php` не вызывается напрямую.
__DIR__                    🡺 /home/user/public_html/fold
dirname(__FILE__)          🡺 <та же>
$_SERVER["REQUEST_URI"]    🡺                       /fold/my.php?var=bla  // Примечание! Показан путь к исходному файлу, если `my.php` не вызывается напрямую.
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /fold/my.php
$_SERVER["PHP_SELF"]       🡺                       /fold/my.php  // Примечание! Показан путь к исходному файлу, если `my.php` не вызывается напрямую.
// Определение HTTPS
$is_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443);            // В некоторых случаях также следует добавить это условие: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO']) 

PHP Функции

dirname($url)              🡺 https://www.site.xyz/fold/
basename($url)             🡺                           my.php
debug_backtrace()          🡺 ПОКАЗЫВАЕТ ПОЛНЫЙ ТРЕЙС ВСЕХ ПОДКУСКЕ НЕЕ ФАЙЛОВ

Для WordPress

// (Предположим, что WordPress установлен в подсистеме: http://site.xyz/sub/)
home_url()                      🡺 http://site.xyz/sub/        // Если is_ssl() истинно, то будет "https"
get_stylesheet_directory_uri()  🡺 http://site.xyz/sub/wp-content/themes/THEME_NAME  [аналогично: get_bloginfo('template_url')]
get_stylesheet_directory()      🡺 /home/user/public_html/sub/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__)        🡺 http://site.xyz/sub/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__)       🡺 /home/user/public_html/sub/wp-content/plugins/PLUGIN_NAME/

Если у вас есть дополнительные вопросы, не стесняйтесь задавать!

0

Мой любимый кросс-платформенный способ получения текущего URL выглядит следующим образом:

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

Этот код сначала проверяет, используется ли HTTPS, и в зависимости от этого добавляет соответствующий протокол (http или https). Затем он объединяет его с хостом и URI запроса, чтобы сформировать полный URL.

0

Просто используйте:

$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Этот код формирует полный URI текущего запроса, комбинируя схему (http или https), хост и URI запроса. Убедитесь, что ваш сервер поддерживает переменную $_SERVER['REQUEST_SCHEME'], так как в некоторых окружениях может потребоваться использовать дополнительную проверку.

0

Для получения корректного URL в PHP, который будет работать на всех веб-серверах (Apache, nginx, IIS и т.д.), вы можете воспользоваться следующим кодом:

$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Этот код проверяет, использует ли соединение HTTPS (что указывается переменной $_SERVER['HTTPS']). Если $_SERVER['HTTPS'] установлена и не равна 'off', это означает, что соединение защищено, и к протоколу добавляется 'https'. В противном случае используется 'http'.

Затем к протоколу присоединяется $_SERVER['HTTP_HOST'] (имя хоста) и $_SERVER['REQUEST_URI'] (URI текущего запроса). Это гарантирует, что вы получите полный URL как на локальном сервере, так и на удаленных серверах, независимо от их конфигурации.

0

При использовании переменных HTTP_HOST и REQUEST_URI в PHP 7.2 необходимо заключать их в кавычки, иначе это вызовет ошибку.

Используйте следующий код:

$actual_link = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

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

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

⚠️ Имейте в виду, что использование данного кода имеет безопасностные последствия, так как клиент может установить значения HTTP_HOST и REQUEST_URI произвольные. Поэтому крайне важно очищать оба значения и проводить проверку введенных данных.

С учетом сказанного, лучше всего определять ссылку на стороне сервера, не полагаясь на URL браузера.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь