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
|