Зачем требуется узнать текущий URL страницы
Часто в PHP программе требуется узнать URL страницы. Иными словами, необходимо сформировать адрес, который посетитель видит в адресной строке своего браузера, для каких-то последующих манипуляций с ним. Наиболее частым применением подобного функционала в моей практике было формирование различных служебных ссылок (добавление GET-параметров к текущему URL).
Самый доступный пример — версия страницы для печати. По адресу http://site.com/blog/hello/ выводится обычная страница сайта, а по http://site.com/blog/hello/?print=1 — движок сайта формирует облегченную версию.
Трудности для новичка при получении текущего URL на PHP
Явной функции по этому поводу нет, потому придется писать самому.
Оставим в покое вероятность того, что начинающий PHP-кодер может еще и не знать о существовании глобального массива $_SERVER — об этой великой тайне ему поведают в нецензурной форме на первом же форуме, куда он встрянет с вопросом.
Начнем с того, что этот самый URL страницы раскидан по частям внутри $_SERVER, и надо его, в буквальном смысле, собирать заново. Далее, новичок, по неопытности, может упустить пару важных моментов:
- протокол соединения: он может быть «https://» — для защищенного соединения;
- порт: он может отличатся от принятого по-умолчанию значения «80» («443» — для защищенного соединения).
Стоит упомянуть о локальных якорях — ссылках вида http://site.com/blog/hello/#comment_form, которые работают исключительно для браузера и не передаются на сервер, поэтому, к сожалению, их мы учесть не сможем.
Готовая PHP-функция текущего URL страницы
function request_url() { $result = ''; // Пока результат пуст $default_port = 80; // Порт по-умолчанию // А не в защищенном-ли мы соединении? if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']=='on')) { // В защищенном! Добавим протокол... $result .= 'https://'; // ...и переназначим значение порта по-умолчанию $default_port = 443; } else { // Обычное соединение, обычный протокол $result .= 'http://'; } // Имя сервера, напр. site.com или www.site.com $result .= $_SERVER['SERVER_NAME']; // А порт у нас по-умолчанию? if ($_SERVER['SERVER_PORT'] != $default_port) { // Если нет, то добавим порт в URL $result .= ':'.$_SERVER['SERVER_PORT']; } // Последняя часть запроса (путь и GET-параметры). $result .= $_SERVER['REQUEST_URI']; // Уфф, вроде получилось! return $result; }
Внимание! В интернетах пишут, что в некоторых случаях, при криворукости администраторов веб-сервера, параметр $_SERVER['HTTPS'] может не работать. Поэтому проверяйте корректность результатов функции при первых запусках скриптов на новом месте.