ПРОЕКТЫ 


  АРХИВ 


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: Переименование URI + memcached



----- kozakd <nginx-forum@xxxxxxxx> wrote:
> Valery Kholodkov Wrote:
> -------------------------------------------------------
> > С использование модуля eval
> > (http://www.grid.net.ru/nginx/eval.ru.html)
> > приблизительно так:
> > 
> >      server {                                     
> >                                                   
> >                         
> >          [...]
> > 
> >          location /pub {
> >              eval_escalate on;
> >              eval $path {
> >                set $memcached_key "$request_uri"; 
> >                                                   
> >                                 
> >                memcached_pass  localhost:11211;
> >              }
> > 
> >              root   /www;
                    
> >                                                   
> >         
> >          }                                        
> >                                                   
> >                         
> >      }
> > 
> > С $request_uri не очень красиво,
> > но могу исправить.
> > 
> 
> Это уже похоже, на то что нужно, но может не заработать стриминг.

Апдейт:

- try_files /$path;
+ try_files /$path @blah;

где @blah -- локейшн, в который переходим если файл не найден.

Кроме того, вместо try_files можно использовать rewrite.

А с патчем во вложении можно использовать $uri внутри eval.

-- 
Regards,
Valery Kholodkov
diff --git a/Changelog b/Changelog
new file mode 100644
index 0000000..2800eef
--- /dev/null
+++ b/Changelog
@@ -0,0 +1,3 @@
+
+Version 1.0.2
+ * Change: restore $uri variable in subrequests
diff --git a/ngx_http_eval_module.c b/ngx_http_eval_module.c
index 675d6cc..c319a22 100644
--- a/ngx_http_eval_module.c
+++ b/ngx_http_eval_module.c
@@ -120,13 +120,31 @@ ngx_module_t  ngx_http_eval_module = {
 static ngx_int_t
 ngx_http_eval_handler(ngx_http_request_t *r)
 {
+    size_t                      loc_len;
     ngx_str_t                   args; 
+    ngx_str_t                   subrequest_uri;
     ngx_uint_t                  flags;
+    ngx_http_core_loc_conf_t   *clcf;
     ngx_http_eval_loc_conf_t   *ecf;
     ngx_http_eval_ctx_t        *ctx;
     ngx_http_request_t         *sr; 
     ngx_int_t                   rc;
     ngx_http_post_subrequest_t *psr;
+    u_char                     *p;
+
+    if(r != r->main) {
+        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+        loc_len = r->valid_location ? clcf->name.len : 0;
+
+        if(r->uri.len != loc_len) {
+            r->uri.data += loc_len;
+            r->uri.len -= loc_len;
+        }
+        else {
+            r->uri.len = 1;
+        }
+    }
 
     ecf = ngx_http_get_module_loc_conf(r, ngx_http_eval_module);
 
@@ -172,7 +190,18 @@ ngx_http_eval_handler(ngx_http_request_t *r)
     args.data = NULL;
     flags = 0;
 
-    if (ngx_http_parse_unsafe_uri(r, &ecf->eval_location, &args, &flags) != 
NGX_OK) {
+    subrequest_uri.len = ecf->eval_location.len + r->uri.len;
+
+    p = subrequest_uri.data = ngx_palloc(r->pool, subrequest_uri.len);
+
+    if(p == NULL) {
+        return NGX_ERROR;
+    }
+
+    p = ngx_copy(p, ecf->eval_location.data, ecf->eval_location.len);
+    p = ngx_copy(p, r->uri.data, r->uri.len);
+
+    if (ngx_http_parse_unsafe_uri(r, &subrequest_uri, &args, &flags) != 
NGX_OK) {
         return NGX_ERROR;
     }
 
@@ -181,7 +210,7 @@ ngx_http_eval_handler(ngx_http_request_t *r)
 
     flags |= NGX_HTTP_SUBREQUEST_IN_MEMORY|NGX_HTTP_SUBREQUEST_WAITED;
 
-    rc = ngx_http_subrequest(r, &ecf->eval_location, &args, &sr, psr, flags);
+    rc = ngx_http_subrequest(r, &subrequest_uri, &args, &sr, psr, flags);
 
     if (rc == NGX_ERROR || rc == NGX_DONE) {
         return rc;
@@ -575,7 +604,7 @@ ngx_http_eval_block(ngx_conf_t *cf, ngx_command_t *cmd, 
void *conf)
 
     clcf->loc_conf = ctx->loc_conf;
     clcf->name = name;
-    clcf->exact_match = 1;
+    clcf->exact_match = 0;
     clcf->noname = 0;
     clcf->internal = 1;
     clcf->noregex = 1;
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.