nginx http-core enhancement: named location in subrequests + directive use_location
Sergey Brester
serg.brester at sebres.de
Wed Apr 29 17:22:51 UTC 2015
Am 29.04.2015 15:48, schrieb Maxim Dounin:
> Hello!
>
> On Wed, Apr 29, 2015 at 09:18:11AM +0200, Sergey Brester wrote:
>
>> Hi, enclosed you will find an attached changeset, that: - allows to fast use of named location in sub requests, such as auth_request, etc. Currently no named location was possible in any sub requests, real (or internal) locations only. # now you can use named location in sub requests: # auth_request /auth_loc/; auth_request @auth_loc; - in addition, a second mini-commit (37d7786e7015) with new directive "use_location" as alias or replacement for "try_files" with no file argument and without checking the existence of file(s): # try_files "" @loc use_location @loc It was allready more times discussed (goto location, etc.). PS. If someone needs a git version of it: https://github.com/sebres/nginx/commits/hg-sb-mod [1] [1 [1]] Regards, sebres. Links: ------ [1] https://github.com/sebres/nginx/commits/hg-sb-mod [1]
>
>> # HG changeset patch # User Serg G. Brester (sebres) <serg.brester at sebres.de> # Date 1430227790 -7200 # Tue Apr 28 15:29:50 2015 +0200 # Node ID 37d7786e7015f8a784e6a4dc3f88f8a7573a4c08 # Parent 96e22e4f1b03ff15a774c6ed34d74b897af32c55 http-core: new directive "use_location" as replacement or alias for "try_files" with no file argument and without checking the existence of file(s): `use_location @loc` replaces `try_files "" @loc`
>
> Something like this was previously discussed more than once, and
> the short answer is "no".
>
>> # HG changeset patch # User Serg G. Brester (sebres) <serg.brester at sebres.de> # Date 1430228073 -7200 # Tue Apr 28 15:34:33 2015 +0200 # Node ID 43135346275c76add5bf953024a3d244f04184ba # Parent 37d7786e7015f8a784e6a4dc3f88f8a7573a4c08 http-core: allow to fast use of named location in (internal) sub requests, ex.: auth_request, etc.; diff -r 37d7786e7015 -r 43135346275c src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c Tue Apr 28 15:29:50 2015 +0200 +++ b/src/http/ngx_http_core_module.c Tue Apr 28 15:34:33 2015 +0200 @@ -22,6 +22,7 @@ typedef struct { static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r); +static ngx_int_t ngx_http_core_find_named_location(ngx_http_request_t *r, ngx_str_t *name); static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r, ngx_http_location_tree_node_t *node); @@ -1542,6 +1543,16 @@ ngx_http_core_find_location(ngx_http_req noregex = 0; #endif + /* already internal - check is resp. can be named
location - search it */ + + if (r->internal && r->uri.len >= 1 && r->uri.data[0] == '@') { + + if (ngx_http_core_find_named_location(r, &r->uri) == NGX_OK) { + + return NGX_OK; + } + } +
>
> And how it's expected to be processed in a named location if
> r->uri is "@..."?
Function "ngx_http_core_find_named_location" if location was found set
"r->loc_conf = (*clcfp)->loc_conf" and returns NGX_OK.
> Note that named locations are ones where requests are handled with their original URIs unmodified. This, in particular, allows to use the original URI to select a file, or in a request to the upstream server, etc. With what you are trying to do it doesn't look different from a static location
As I wrote it already (of course it is not a static location):
Example, instead of :
# auth_request /auth_loc/;
You can use named location @auth_loc and write now:
auth_request @auth_loc;
Regards,
sebres.
Links:
------
[1] https://github.com/sebres/nginx/commits/hg-sb-mod
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20150429/6302c5c5/attachment-0001.html>
More information about the nginx-devel
mailing list