ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

функциональность mod_vhost_alias + patch



Многим бы хотелось видеть функциональность Mod_vhost_alias в nginx.
Патчик прилагается, пока только для статики, тоже самое будет для fastcgi.

Мы имеем возможность задавать директиву root с синтаксисом как в Mod_vhost_alias.

обычно:
location /
{
 root /sites/site1.com/html;
}
для доменов целиком:
location /
{
 root /sites/%0/html;
}
например обрезаем домены до 3-го уровня:
location /
{
 root /sites/%-3.0.%-2.0.%-1.0/html;
}

Просьба сообщать о найденных ошибках, nginx с патчем удачно прошел тестирование на загруженном сервере.
64a65,179
> #define HUGE_STRING_LEN 0x2000
> void ngx_vhost_calc_root(ngx_str_t *newroot, ngx_str_t *cfgroot, 
> ngx_http_request_t *r)
> {
>     /* 0..9 9..0 */
>     enum { MAXDOTS = 19 };
>     const char *dots[MAXDOTS+1];
>     int ndots;
> 
>     char buf[HUGE_STRING_LEN];
>     char *dest, last;
> 
>     int N, M, Np, Mp, Nd, Md;
>     const char *start, *end;
> 
>     const char *p;
>     const char *map = cfgroot->data;
> 
>     ndots = 0;
>     dots[ndots++] = r->headers_in.host->value.data - 1; /* slightly naughty */
>     for (p = r->headers_in.host->value.data; *p && *p!=':'; ++p){
>         if (*p == '.' && ndots < MAXDOTS) {
>             dots[ndots++] = p;
>         }
>     }
>     dots[ndots] = p;
> 
>     dest = buf;
>     last = '\0';
>     while (*map) {
>         if (*map != '%') {
>             /* normal characters */
>             last = *dest++ = *map++;
>             continue;
>         }
>         /* we are in a format specifier */
>         ++map;
>         /* can't be a slash */
>         last = '\0';
>         /* %% -> % */
>         if (*map == '%') {
>             ++map;
>             *dest++ = '%';
>             continue;
>         }
>         N = M = 0;   /* value */
>         Np = Mp = 0; /* is there a plus? */
>         Nd = Md = 0; /* is there a dash? */
>         if (*map == '-') ++map, Nd = 1;
>         N = *map++ - '0';
>         if (*map == '+') ++map, Np = 1;
>         if (*map == '.') {
>             ++map;
>             if (*map == '-') {
>                 ++map, Md = 1;
>             }
>             M = *map++ - '0';
>             if (*map == '+') {
>                 ++map, Mp = 1;
>             }
>         }
>         /* note that N and M are one-based indices, not zero-based */
>         start = dots[0]+1; /* ptr to the first character */
>         end = dots[ndots]; /* ptr to the character after the last one */
>         if (N != 0) {
>             if (N > ndots) {
>                 start = "_";
>                 end = start+1;
>             }
>             else if (!Nd) {
>                 start = dots[N-1]+1;
>                 if (!Np) {
>                     end = dots[N];
>                 }
>             }
>             else {
>                 if (!Np) {
>                     start = dots[ndots-N]+1;
>                 }
>                 end = dots[ndots-N+1];
>             }
>         }
>         if (M != 0) {
>             if (M > end - start) {
>                 start = "_";
>                 end = start+1;
>             }
>             else if (!Md) {
>                 start = start+M-1;
>                 if (!Mp) {
>                     end = start+1;
>                 }
>             }
>             else {
>                 if (!Mp) {
>                     start = end-M;
>                 }
>                 end = end-M+1;
>             }
>         }
>         for (p = start; p < end; ++p) {
>             *dest++ = ngx_tolower(*p);
>         }
>     }
>     *dest = '\0';
> 
>     newroot->len = ngx_strlen(buf);
>     newroot->data = ngx_palloc(r->pool, newroot->len+1);
>     if(newroot->data)
>     {
>         ngx_cpystrn(newroot->data, buf, newroot->len+1);
>     } else
>     {
>       newroot->len = 0;
>     }
> }
72c187
<     ngx_str_t                    name, location;
---
>     ngx_str_t                    root, name, location;
128a244,247
>     ngx_vhost_calc_root(&root, &clcf->root, r);
>     if (root.data == NULL) {
>         return NGX_HTTP_INTERNAL_SERVER_ERROR;
>     }
131c250
<         name.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + 2
---
>         name.data = ngx_palloc(r->pool, root.len + r->uri.len + 2
137c256
<         last = ngx_cpymem(name.data, clcf->root.data, clcf->root.len);
---
>         last = ngx_cpymem(name.data, root.data, root.len);
164c283
<         name.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + 2);
---
>         name.data = ngx_palloc(r->pool, root.len + r->uri.len + 2);
169c288
<         location.data = ngx_cpymem(name.data, clcf->root.data, 
clcf->root.len);
---
>         location.data = ngx_cpymem(name.data, root.data, root.len);


 




Copyright © Lexa Software, 1996-2009.