Генерация статичного образа сайта и mod_rewrite

Категория: / DEV Блог / PHP (LAMP)
Имеем cms. Для уменьшения нагрузки для модуля страниц добавим возможность сохранения статичных копий в виде

/site_root/static/%host%/путь/до/страницы/в/cms/index.html # для папок
/site_root/static/%host%/путь/до/страницы/в/cms/страница.html # для страниц


Кэш есть, теперь можно завернуть анонимусов на адрес статичной странцы.
Делаем это с помощью mod_rewrite.

# такие пути не реврайтим
RewriteCond %{REQUEST_URI} !^\/$            
RewriteRule !(\/|\.html|\.php)$ - [L]
 
# работаем только с анонимусами
RewriteCond %{HTTP_COOKIE} !user_logged_in
RewriteRule ^ - [S=3]
 
# отдача статичного кэша
# это существующие страницы
RewriteCond %{DOCUMENT_ROOT}/static/%{HTTP_HOST}/%{REQUEST_URI} -f
RewriteRule ^(.*) /static/%{HTTP_HOST}/$1 [L]    
# это папки, добавляем index.html
RewriteCond %{DOCUMENT_ROOT}/static/%{HTTP_HOST}/%{REQUEST_URI} -d
RewriteCond %{DOCUMENT_ROOT}/static/%{HTTP_HOST}/%{REQUEST_URI}/index.html -f
RewriteRule ^(.*) /static/%{HTTP_HOST}/$1 [L]          
# это условие для главной
RewriteCond %{REQUEST_URI} ^\/$
RewriteCond %{DOCUMENT_ROOT}/static/%{HTTP_HOST}/index.html -f
RewriteRule .* /static/%{HTTP_HOST}/index.html [L]


Замечание:
Движок работает с данными в кодировке UTF-8.

Если пути содержат кириллицу, то в windows нужно предварительно перед сохранением статичных файлов, перекодировать их имена в CP-1251,
тогда проверка RewriteCond на наличие файла будет срабатывать.

С другой стороны, в системе FreeBSD 6, имена файлов нужно преобразовать в кодировку UTF-8. Разобраться почему, можно смотря лог преобразований mod_rewrite.

[test.local/sid#815bdd8][rid#8317058/initial] (3) [perdir /www/test.local/htdocs/] add path info postfix: /www/test.local/htdocs/двигатель -> /www/test.local/htdocs/двигатель/
[test.local/sid#815bdd8][rid#8317058/initial] (3) [perdir /www/test.local/htdocs/] strip per-dir prefix: /www/test.local/htdocs/двигатель/ -> двигатель/
[test.local/sid#815bdd8][rid#8317058/initial] (3) [perdir /www/test.local/htdocs/] applying pattern '^(.*)index\.(php|html)$' to uri 'двигатель/'