Mercurial > hg > nginx
diff src/http/modules/ngx_http_index_handler.c @ 45:f1ee46c036a4
nginx-0.0.1-2003-01-10-09:09:20 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 10 Jan 2003 06:09:20 +0000 |
parents | 0e81ac0bb3e2 |
children | f84a648211f4 |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_index_handler.c +++ b/src/http/modules/ngx_http_index_handler.c @@ -13,6 +13,7 @@ #include <ngx_http_index_handler.h> +static int ngx_http_index_init(ngx_pool_t *pool); static void *ngx_http_index_create_conf(ngx_pool_t *pool); static char *ngx_http_index_merge_conf(ngx_pool_t *p, void *parent, void *child); @@ -55,13 +56,13 @@ ngx_module_t ngx_http_index_module = { &ngx_http_index_module_ctx, /* module context */ ngx_http_index_commands, /* module directives */ NGX_HTTP_MODULE_TYPE, /* module type */ - NULL /* init module */ + ngx_http_index_init /* init module */ }; int ngx_http_index_handler(ngx_http_request_t *r) { - int i; + int i, len; char *name, *file; ngx_str_t loc, *index; ngx_err_t err; @@ -76,19 +77,31 @@ int ngx_http_index_handler(ngx_http_requ core_cf = (ngx_http_core_loc_conf_t *) ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); - ngx_test_null(name, + ngx_test_null(r->path.data, ngx_palloc(r->pool, core_cf->doc_root.len + r->uri.len + cf->max_index_len), NGX_HTTP_INTERNAL_SERVER_ERROR); - loc.data = ngx_cpystrn(name, core_cf->doc_root.data, + loc.data = ngx_cpystrn(r->path.data, core_cf->doc_root.data, core_cf->doc_root.len + 1); file = ngx_cpystrn(loc.data, r->uri.data, r->uri.len + 1); + r->path.len = file - r->path.data; index = (ngx_str_t *) cf->indices->elts; for (i = 0; i < cf->indices->nelts; i++) { - ngx_memcpy(file, index[i].data, index[i].len + 1); + + if (index[i].data[0] != '/') { + if (!r->path_not_found) { + continue; + } + + ngx_memcpy(file, index[i].data, index[i].len + 1); + name = r->path.data; + + } else { + name = index[i].data; + } fd = ngx_open_file(name, NGX_FILE_RDONLY); if (fd == NGX_INVALID_FILE) { @@ -98,6 +111,12 @@ int ngx_http_index_handler(ngx_http_requ } #if (WIN32) if (err == ERROR_PATH_NOT_FOUND) { + r->path_not_found = 1; + continue; + } +#else + if (err == NGX_ENOTDIR) { + r->path_not_found = 1; continue; } #endif @@ -108,11 +127,20 @@ int ngx_http_index_handler(ngx_http_requ return NGX_HTTP_INTERNAL_SERVER_ERROR; } - r->file.name.len = core_cf->doc_root.len + r->uri.len + index[i].len; r->file.name.data = name; r->file.fd = fd; - loc.len = r->uri.len + index[i].len; + if (index[i].data[0] == '/') { + r->file.name.len = index[i].len; + loc.len = index[i].len; + loc.data = index[i].data; + + } else { + loc.len = r->uri.len + index[i].len; + r->file.name.len = core_cf->doc_root.len + r->uri.len + + index[i].len; + } + return ngx_http_internal_redirect(r, loc); } @@ -120,6 +148,18 @@ int ngx_http_index_handler(ngx_http_requ } +static int ngx_http_index_init(ngx_pool_t *pool) +{ + ngx_http_handler_pt *h; + + ngx_test_null(h, ngx_push_array(&ngx_http_index_handlers), NGX_ERROR); + + *h = ngx_http_index_handler; + + return NGX_OK; +} + + static void *ngx_http_index_create_conf(ngx_pool_t *pool) { ngx_http_index_conf_t *conf;