Потребовалось мне установить LiveStreet 0.5.1 на свой VDS, но поскольку апача у меня нет, то столкнулся с проблемой .htaccess. А именно: .htaccess не поддерживается nginx, т.к. nginx запускается уже с готовым конфигом (сделано для улучшения быстродействия). Сам же LiveStreet пестрит файликами .htaccess следующего содержания:
Order Deny,Allow Deny from all
Видимо автор пытался бороться с хакерами. Возможно это имело какой-то смысл и фичу решено было сохранить, но как реализовать конфиг nginx так, чтобы обработать все .htaccess? Идея родилась не с первого разу, но вот она в кратце: переносим все неиспользуемые файлы и папки за пределы web-директории, меняем пути конфигов и дело в шляпе. Но не все так просто :), еще придется подправить часть файлов.
Для начала устанавливаем LiveStreet обычным образом в WebDIR (он создаст таблички в БД и конфиги). После этого начинаем курочить — общая структура публичной папки будет такая:
Получается она довольно просто — все ненужные папки с полными путями переносятся в «приватную» папку, здесь остаются только необходимые из Web файлы. Я оставил index.php, папку uploads; в папке templates остались только папка cache и папка с картинками из темы (у меня это skin/new-jquery/images), так же осталась часть библиотек, которые могут быть вызваны из Web через AJAX или подобные способы. Библиотеки делил так: все что содержат файл .htaccess — приватные, все остальные оставляем. Таким образом в приватной папке образовалась следующая структура:
Теперь поправим конфиг nginx — у меня он будет выглядеть так:
server { listen 78.47.245.185:80; root /home/tech-today.ru/public_html; server_name tech-today.ru www.tech-today.ru; access_log /home/tech-today.ru/logs/access.log; error_log /home/tech-today.ru/logs/error.log; client_max_body_size 64m; location ~ ^/plugins/[^\/]+/templates/skin/.+\.(js|css|jpg|gif|png|xml|xsl) { root /home/tech-today.ru/private_html; } location / { try_files $uri $uri/ @tech_entry; index index.php index.html; } location ~ \.php$ { try_files $uri @tech_entry; fastcgi_pass unix:/home/tech-today.ru/tmp/php-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /public_html$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /public_html; } location @tech_entry { fastcgi_pass unix:/home/tech-today.ru/tmp/php-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /public_html/index.php; fastcgi_param DOCUMENT_ROOT /public_html; } }
Для всех плагинов, ресурсы для которых надо тянуть из папки плагина, добавили соответствующий обработчик nginx. Для остальных скриптов все более чем обычно. Теперь хачим сам движок:
1. /private_html/config/config.php, добавляем:
$config['path']['public']['server'] = '___path.root.server___'; $config['path']['public']['cache'] = '___path.root.server___/templates/cache';
2. /private_html/config/config.local.php, правим пути:
$config['path']['root']['web'] = 'http://tech-today.ru'; $config['path']['root']['server'] = '/private_html'; $config['path']['public']['server'] = '/public_html'; $config['path']['public']['cache'] = '/public_html/templates/cache'; $config['sys']['cache']['dir'] = '/tmp/';
В качестве path.root.server теперь приватная папка.
path.public.server — мы добавили параметр публичной папки.
path.public.cache — путь к папке кеша в публичной папке.
sys.cache.dir — путь к временной директории (должна быть не доступна из Web).
3. /private_html/classes/modules/topic/Topic.class.php
Заменяем все path.root.server на path.public.server.
4. /private_html/engine/modules/image/Image.class.php
Заменяем все path.root.server на path.public.server.
5. /private_html/engine/modules/viewer/Viewer.class.php
Добавим в класс свойство (в любое место до начала методов):
protected $resCacheDir='';
Ищем функцию Init:
public function Init($bLocal=false) {
В конце функции добавляем:
$this->resCacheDir = Config::Get('path.public.cache');
Ищем функцию Compress:
protected function Compress($aFiles,$sType) {
В функции заменяем строку:
$sCacheDir = $this->sCacheDir."/".Config::Get('view.skin');
На строку:
$sCacheDir = $this->resCacheDir."/".Config::Get('view.skin');
Ищем функцию GetRealpath
protected function GetRealpath($sPath) {
заменяем return realpath($sPath); на следующее:
$rp = realpath($sPath); if (!$rp) $rp = realpath(str_replace(Config::Get('path.root.server'), Config::Get('path.public.server'), $sPath)); return $rp;
Ищем функцию GetWebPath:
protected function GetWebPath($sFile) {
заменяем ее содержимое на следующее:
protected function GetWebPath($sFile) { $wp = str_replace( str_replace(DIRECTORY_SEPARATOR,'/',Config::Get('path.public.server')), Config::Get('path.root.web'), str_replace(DIRECTORY_SEPARATOR,'/',$sFile) ); if ($wp == $sFile) { $wp = str_replace( str_replace(DIRECTORY_SEPARATOR,'/',Config::Get('path.root.server')), Config::Get('path.root.web'), str_replace(DIRECTORY_SEPARATOR,'/',$sFile) ); } return $wp; }
ищем функцию GetServerPath:
protected function GetServerPath($sFile) {
заменяем ее содержимое на следующее:
protected function GetServerPath($sFile) { $int = true; if (strpos($sFile, Config::Get('path.root.engine_lib')) !== false) $int = false; /** * Убираем из путей www */ $sFile = str_replace('//www.','//',$sFile); $sPathWeb = str_replace('//www.','//',Config::Get('path.root.web')); /** * Производим замену */ $sFile=str_replace($sPathWeb,Config::Get(($int ? 'path.root.server' : 'path.public.server')),$sFile); return str_replace('/',DIRECTORY_SEPARATOR,$sFile); }
6. /public_html/index.php
Ищем строку:
require_once("./config/loader.php");
и заменяем на:
require_once("/private_html/config/loader.php");
Теперь все устанавливаемые плагины надо класть в папку /private_html/plugins и активировать как обычно. Это в общем-то все, но есть некоторые сложности, порожденные нашими хаками — некоторые кривые плагины перестают работать ;). Примером такой проблемы может быть частичное падение плагина aceadminpanel. Исправляется это элементарно:
В файле /private_html/plugins/aceadminpanel/classes/actions/ActionAdmin.class.php ищем функцию _callAdminAddon:
protected function _callAdminAddon($aAddon, $aArgs)
В ней перед строкой:
include_once $sFileName;
добавляем строку:
if (!is_file($sFileName)) $sFileName = Config::Get('path.root.server') . DIRECTORY_SEPARATOR . $sFileName;
Большинство плагинов работает «из коробки» и в допилах не нуждается.
Ой мама… зачем же так сложно?
я сделал влоб — составил список каталогов где есть .htaccess и занес их в список deny. дел на минуту
location / {
index index.php;
if (!-e $request_filename) {
rewrite ^(/.*)$ /index.php?q=$1 last;
break;
}
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|htm)$ {
access_log off;
log_not_found off;
expires max;
}
location ~ ^/(classes/actions/|classes/blocks/|classes/hooks/|classes/modules/|config/|engine/classes/|engine/lib/external/CSSTidy-1.3/|engine/lib/external/DbSimple/|engine/lib/external/DklabCache/|engine/lib/external/Jevix/|engine/lib/external/JSMin-1.1.1/|engine/lib/external/kcaptcha/fonts/|engine/lib/external/phpMailer/|engine/lib/external/Smarty/|engine/lib/external/Sphinx/|engine/lib/external/XXTEA/|include/cron/|logs/|plugins/page/classes/|plugins/page/config/|plugins/page/templates/|plugins/profiler/classes/|plugins/profiler/config/|plugins/profiler/templates/|templates/|tmp/|uploads) {
deny all;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
location ~ .(tpl|log)$ {
deny all;
}
Я тоже думал про большой большой регексп… и мне что-то было геморно все перечислять + установка плагина — надо опять в конфиг сервера лезть и там что-то менять и перезапускать… Оно конечно вариант как вы написали но не оч красивый ИМХО 😉
Немного перепилил ваш конфиг — можно использовать вместо портянки с правкой файлов.
Подскажите, как тут вставить фото?
Я вот пробую, но никак не выходит 🙁
Обилие интересных статей на вашем сайте меня поражает! Автору – удачи и новых интересных постов!