понедельник, 19 декабря 2011 г.

apache mod_vhost_alias

Есть такой модуль у апача, mod_vhosts, хорош для массхостинга, а также для программерских серваков: для добавления сайта достаточно создать каталог.

Но есть нюансы:
1) проблемы с mod_rewrite, лечится в .htaccess строкой RewriteBase /
2) Проблема с DocumentRoot, равным корневому каталогу. Тут чуть сложнее, надо писать скрипты-обработчики.

Наш скрипт для перла (года так 2007)
# Author Andrey Ivanov
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[], char *envp[])
{
        int i=0, dr=-1, sn=-1;
        char *foo;

        while(envp[i]!=NULL)
        {
                if (strstr(envp[i], "DOCUMENT_ROOT")==envp[i]) dr=i;
                if (strstr(envp[i], "SERVER_NAME")==envp[i]) sn=i;
                i++;
        }

        if (sn!=-1 && dr!=-1)
        {
                foo=strchr(envp[sn]+12, '.');
                if(foo) *foo=0;
                sprintf(envp[dr], "DOCUMENT_ROOT=/var/www/%s/site/htroot", envp[sn]+12);
        }

        execve("/usr/local/bin/perl5.8.8", argv, envp);

        return(0);
}
Скомпилированый файл называется perl и кладется в /usr/local/bin/, заменяя старый симлинк.

Для пхп есть например такой метод

php_admin_value auto_prepend_file /path/setdocroot.php

<?php apache_setenv("DOCUMENT_ROOT",$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME'])) ?>
отсюда

$l = explode("/",$_SERVER['SCRIPT_FILENAME']);
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"] = implode("/",Array( $l[0], $l[1], $l[2], $l[3], $l[4]));
С хабра.

"Что касается проблем с $_SERVER['DOCUMENT_ROOT'] и RewriteBase, примечательно, что такие же проблемы есть и при реализации виртуальных хостов с помощью mod_rewrite. Не смотрел исходники vhost_alias, но такое чувство, что он с помощью mod_rewrite и реализован."
Оттуда же. Линк потерян, сорь.

Комментариев нет:

Отправить комментарий