Получить полный URL в PHP
Проблема с получением полного URL в PHP с учётом масок в .htaccess
Я использую следующий код для получения полного URL:
$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
Однако у меня есть некоторые правила в файле .htaccess
, из-за чего то, что отображается в URL, не всегда соответствует реальному пути файла.
Мне нужно получить именно тот URL, который отображается в адресной строке веб-браузера, а не реальный путь файла на сервере.
Как мне получить полный URL, включая любые маски и редиректы, которые применяются в .htaccess
?
5 ответ(ов)
Привет! На вопрос о разборе 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/
Если у вас есть дополнительные вопросы, не стесняйтесь задавать!
Мой любимый кросс-платформенный способ получения текущего URL выглядит следующим образом:
$url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
Этот код сначала проверяет, используется ли HTTPS, и в зависимости от этого добавляет соответствующий протокол (http или https). Затем он объединяет его с хостом и URI запроса, чтобы сформировать полный URL.
Просто используйте:
$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
Этот код формирует полный URI текущего запроса, комбинируя схему (http или https), хост и URI запроса. Убедитесь, что ваш сервер поддерживает переменную $_SERVER['REQUEST_SCHEME']
, так как в некоторых окружениях может потребоваться использовать дополнительную проверку.
Для получения корректного 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 как на локальном сервере, так и на удаленных серверах, независимо от их конфигурации.
При использовании переменных 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 браузера.
Как вывести ошибки PHP на экран?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?
Как получить расширение файла в PHP?