ПРОЕКТЫ 


  АРХИВ 


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]

Re: Вопрос по mod_rewrite



В Птн, 22.04.2005, в 15:51, Alexey Bestciokov пишет:
> нет, этого функционанала на данный момент нет
> но - можно обрабатывать 404 ошибку с =302 :)
> и получать такой же результат
> 
> d> Здравствуйте!
> 
> d> Можно ли в nginx сделать аналог апачевского
> 
> d> RewriteCond %{REQUEST_FILENAME} !-f
> d> RewriteRule ^dir/(\d+).gif$ bin/script.cgi?$1 [L,QSA]
> 
> d> т.е. Если картинки нет- она генерится скриптом, если есть - отдается с 
> диска

на самом деле можно, но только с патчем, see attachment

я использую это примерно в такой конфигурации :

location / {
    root /html;

    if ($file_not_exists) {
        rewrite ^/(.*)$ /proxied/$1 last;
    }
}

location /proxied/ {
    proxy_pass ...
    ...
}

"it works for me" и никаких гарантий на этот хак не даю ;-)

> 
> d> Заленский Дмитрий
> 
> 
> 
> 
> 
> Алексей Бещ?ков.
> proforg@xxxxxxxxxxxx
-- 
Andrei Nigmatulin
GPG PUB KEY 6449830D

diff -burp nginx-0.1.28/src/http/modules/ngx_http_rewrite_module.c 
nginx-0.1.28.my/src/http/modules/ngx_http_rewrite_module.c
--- nginx-0.1.28/src/http/modules/ngx_http_rewrite_module.c     2005-04-08 
17:59:44.000000000 +0400
+++ nginx-0.1.28.my/src/http/modules/ngx_http_rewrite_module.c  2005-04-17 
19:45:09.000000000 +0400
@@ -805,6 +805,52 @@ ngx_http_rewrite_invalid_referer_code(ng
 
 
 static void
+ngx_http_rewrite_file_not_exists_code(ngx_http_rewrite_engine_t *e)
+{
+    ngx_http_request_t           *r;
+       ngx_http_core_loc_conf_t     *clcf;
+       ngx_file_info_t                      fi;
+       ngx_str_t                                        name;
+       u_char*                                          last;
+
+       r = e->request;
+       clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+       name.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + 2);
+       if (name.data == NULL) {
+           e->sp->value = 1;
+           e->sp->text.len = 1;
+           e->sp->text.data = (u_char *) "1";
+           e->sp++;
+
+               return;
+       }
+
+       last = ngx_cpymem(name.data, clcf->root.data, clcf->root.len);
+       last = ngx_cpystrn(last, r->uri.data, r->uri.len + 1);
+
+       name.len = last - name.data;
+
+       if (ngx_file_info(name.data, &fi) == NGX_FILE_ERROR) {
+           e->sp->value = 1;
+           e->sp->text.len = 1;
+           e->sp->text.data = (u_char *) "1";
+           e->sp++;
+       }
+       else {
+           e->sp->value = 0;
+           e->sp->text.len = 0;
+           e->sp->text.data = (u_char *) "";
+           e->sp++;
+       }
+
+       ngx_pfree(r->pool, name.data);
+
+    e->ip += sizeof(uintptr_t);
+}
+
+
+static void
 ngx_http_rewrite_nop_code(ngx_http_rewrite_engine_t *e)
 {
     e->ip += sizeof(uintptr_t);
@@ -953,6 +999,11 @@ ngx_http_rewrite_merge_loc_conf(ngx_conf
             continue;
         }
 
+        if (*code == (uintptr_t) &ngx_http_rewrite_file_not_exists_code) {
+            code++;
+            continue;
+        }
+
         if (*code == (uintptr_t) &ngx_http_rewrite_nop_code) {
             code++;
             continue;
@@ -1503,6 +1554,18 @@ ngx_http_rewrite_variable(ngx_conf_t *cf
 
         *code = ngx_http_rewrite_invalid_referer_code;
 
+       } else if (value->len == sizeof("file_not_exists") - 1
+               && ngx_strncmp(value->data, "file_not_exists",
+                                               sizeof("file_not_exists") - 1) 
== 0)
+       {
+        code = ngx_http_rewrite_start_code(cf->pool, &lcf->codes,
+                                           sizeof(ngx_http_rewrite_code_pt));
+        if (code == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        *code = ngx_http_rewrite_file_not_exists_code;
+
     } else {
         var = ngx_http_add_variable(cf, value, 0);
 


 




Copyright © Lexa Software, 1996-2009.