Запуск CppCMS-приложения в корне Web-сервера
Введение
В большинстве примеров этого wiki приложения запускаются из каких-либо простых URL — определенных именем скрипта, например для примера "Hello World" приложение запускается из URL "/hello", приложение доски объявлений запускается из URL "/mb".
Это просто и удобно - все статические файлы предоставляются как есть, а URL приложения использует свои собственные пути, например:
Статические файлы:
/media/style.css
Приложение:
/mb /mb/tree/1 /mb/comment/10
, где "/tree/1" и "/comment/10" подпути приложения.
Однако, часто пожет требоваться запуск приложения из "корня" web-сервиса так, чтобы главным URL был "/".
Наивное решение - перенаправление всех запросов приложению, можэет не работать, т.к. статические файлы должны предоставляться из другой локации, начинающейся с "/" и обслуживание статических файлов - не дело приложения.
Т.о. чтобы это сделать - нужно использовать правила перезаписи URL, существующие в любом современном web-сервере.
Так, если приложение должно стартовать из корня "/" и все медиа-файлы должны предоставляться из директории "/media/", нам бы хотелось оставить URL "/media/*" нетронутым и переписать все другие URL'ы типа "/tree/1" на "/mb.fcgi/tree/1", где "/mb.fcgi" - скрипт вывода.
Т.о. мы должны показать как создать корректные правила перезаписи для web-сервера для обслуживания приложения в корне хоста.
Предполагается что:
- Все статические файлы лежат в директории /media/относительно web-корня приложения.
- Обработчик FastCGI отображен в "скрипт" /mb.fcgi.
См. руководство Запуск CppCMS с Web-серверами.
Правила перезаписи для различных web-серверов
Apache
Потребуется включить mod_rewrite и поместить в раздел
<VirtualHost *> следующие правила перезаписи
RewriteEngine On RewriteRule ^(/media/.*)$ $1 [PT] RewriteRule ^/(.*)$ /mb.fcgi/$1 [QSA,L]
Все файлы "/media/" будут обслуживаться как есть с файловым флагом [PT],
а остальные URL типа /some/url будут отображаться в /mb.fcgi/some/url`
Lighttpd
Потребуется включить mod_rewrite и предоставить следующее правило:
url.rewrite-once = ( "^(/media/.*)" => "$1", "^/(.*)" => "/mb.fcgi/$1" )
Обратите внимание на использование директивы rewrite-once - как только
правило "^(/media/.*)" выполняется, оно больше не будет перезаписываться.
Nginx
Правило перезаписи, которое должно определяться до обработчика FastCGI следующее:
rewrite ^(/media/.*)$ $1 last; rewrite ^/(.*)$ /mb.fcgi/$1 ;
Примечание: параметр last используется для корня /media/.* для предотвращения
последующих замен. Это не делается для корневого URL ^/(.*)$, т.к. FastCGI
использует перезапись самостоятельно.
Встраиваемый CppCMS
Секция http.rewrite определяет правила перезаписи URL.
Это реализовано в CppCMS начиная с CppCMS 0.99.11.
Секция конфигурации http должна выглядеть как:
"http" : {
  "script" : "/mb.fcgi",
  "rewrite" : [
    { "regex" : "/media(/.*)?", "pattern" : "$0" },
    { "regex" : ".*" , "pattern" : "/mb.fcgi$0" }
  ]
}
 
 