Этот пост будет первым из серии "Танцы с бубном в Joomla". Почему так? Несмотря на все достоинства среды, возникают проблемы, которые приходится внедрять с помощью внедрения своего кода в начинку самой джумлы, что не есть хорошо, но все же. Собственно это и есть одна из причин поста - сохранить изменения. В коде помечаю такие места с помощью комментария "// cay127" и команда grep мне всегда поможет быстро найти все, что было изменено вручную.
И еще пару слов - да, где-то может плагин был бы лучшим решением, может где-то не докопал до истины, но просто экономил время. Плагин отмечу - не всегда применим и это скоро станет понятно.
После вступления
Проблема вот в чем - джумла строит ссылки следующим образом (автоматически):
$theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
Но у меня переменная $_SERVER['HTTP_HOST']
содержит IP адрес, а не название домена вовсе. Т.о. быстрое решение стало следующим: правим файл:
libraries/joomla/uri/uri.php
точка опоры:
public static function getInstance($uri = 'SERVER')
Без лишних подробностей изменения (помним о комментарии):
public static function getInstance($uri = 'SERVER') { if (empty(self::$instances[$uri])) { // Are we obtaining the URI from the server? if ($uri == 'SERVER') { // Determine if the request was over SSL (HTTPS). // cay127 if (true OR sset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { $https = 's://'; } else { $https = '://'; } /* * Since we are assigning the URI from the server variables, we first need * to determine if we are running on apache or IIS. If PHP_SELF and REQUEST_URI * are present, we will assume we are running on apache. */ if (!empty($_SERVER['PHP_SELF']) && !empty($_SERVER['REQUEST_URI'])) { // To build the entire URI we need to prepend the protocol, and the http host // to the URI string. // cay127 // $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // [HTTP_HOST] => 212.XX.XX.XX $theURI = 'http' . $https . 'www.site.ru' . $_SERVER['REQUEST_URI']; }
Реальный IP и домен скрыты, но суть ясна. Плюс прописал условие всегда использовать только HTTPS.