Запуск 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" } ] }