В сети есть масса отличных CGI программ. Однако их применение обычно надоедает, поэтому многие веб-мастера их не используют. Даже функция Action handler Apache'а для MIME-типов применима только тогда, когда CGI программы не нуждаются в специальных URL (в действительности PATH_INFO
и QUERY_STRINGS
) для них является входом. Сначала, давайте настроим новый тип файла с расширением .scgi
(для защищенных CGI) которые будут обрабатываться популярной программой cgiwrap
. Проблема здесь заключается в том что для этого случая мы используем однородный URL (см. выше) и и какой-либо файл находящийся внутри домашних каталогов пользователей имеет URL /u/user/foo/bar.scgi
. Однако cgiwrap
требует URL в виде /~user/foo/bar.scgi/
. Следующая директива решает эту проблему:
RewriteRule ^/[uge]/([^/]+)/\.www/(.+)\.scgi(.*) ...
... /internal/cgi/user/cgiwrap/~$1/$2.scgi$3 [NS,T=application/x-http-cgi]
Или предположим что у нас есть несколько полезных программ: wwwlog
(отображающая access.log
для поддерева URL и wwwidx
(запускающая Glimpse на поддереве URL). Мы должны предоставить область URL для этих программ чтобы они знали для какой области они должны работать. Однако обычно это ужасно, потому что они все время запрашиваются из тех областей, т.е. обычно мы бы запускали программу swwidx
из /u/user/foo/
через ссылку
/internal/cgi/user/swwidx?i=/u/user/foo/
которая ужасна. Так как мы должны жестко связывать и местоположение области и местонахождение CGI внутри гиперссылки. В случае если нам необходимо реорганизовать эту область, мы тратим массу времени меняя различные гиперссылки.
Решение в этом случае это сделать новый специальный формат URL который автоматически приводит к вызову нужного CGI. Настраиваем так:
RewriteRule ^/([uge])/([^/]+)(/?.*)/\* /internal/cgi/user/wwwidx?i=/$1/$2$3/
RewriteRule ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3
Теперь гиперссылка для поиска /u/user/foo/
считывает только
HREF="*"
который внутренне автоматически трансформируется в
/internal/cgi/user/wwwidx?i=/u/user/foo/
То же самое приводит к вызову CGI программы для доступа к логам когда используется гиперссылка :log
.