Precedence return directive and nested locations

Dipl. Ing. Sergey Brester serg.brester at sebres.de
Wed Aug 24 17:57:50 UTC 2022


 

OK, 

regarding the "fallback" location, this one can be used (empty -
shortest match): 

location "" {
 return 444;
}

Regards,
Serg. 

24.08.2022 19:38, Sergey Brester via nginx-devel wrote: 

> Hi, 
> 
> it seems that the question of precedence of non-conditional _return_ directive vs nested _location_s is not really clear,
> or rather some constellations (like fallback) are impossible or else the configuration may look weird.
> 
> For instance: 
> 
> server {
> server_name ...;
> 
> location ~ ^/(some-uri|other-uri) {
> return 200 ...;
> }
> 
> # fallback for any not matched uri:
> return 444;
> } 
> 
> will ALWAYS return with 444 for that server no matter whether it matches the location(s) or doesn't.
> Basically the locations are totally superfluous here (despite specified), considering the return is non-conditional. 
> 
> Sure, the documentation says "Stops processing and returns the specified _code_ to a client.",
> but normally the nested locations (if matched) have always higher precedence over anything else
> in the parent location. 
> 
> Furthermore the docu of ngx_http_rewrite_module [1] says at begin: 
> 
> * the directives of this module specified on the server [2] level are executed sequentially;
> 
> * repeatedly: 
> 
> * a location [3] is searched based on a request URI;
> * the directives of this module specified inside the found location are executed sequentially;
> 
> What is a bit ambiguous. But if it is to understand directly - it is clear that a return directive at server level
> bypasses all other locations (sequence in current level before its locations).
> Just it makes hardly possible (up to impossible depending on location tree) to use return directive for a fallback case. 
> 
> To implement the fallback return, one can surely pack this into a location like: 
> 
> location ~ .* { return 444; } 
> Just it is a bit ugly in my opinion, let alone it would quasi disallow the usage of longest match prefix locations, 
> because they work only if no match with a regular expression is found (then the configuration of the 
> prefix location remembered earlier is used). 
> 
> So I assume:
> 
> * either it is a lack of documentation (and it must get a hint about the precedence) 
> and/or still better a description how one could achieve such a "fallback" return (location or whatever).
> (but do we have at all a possibility to specify such proper fallback location matching at end, 
> if nothing else matched?)
> 
> * or (improbably) this is a flaw and must be "fixed" or enhanced rather for a non-conditional return case
> (unsure it wouldn't introduce some compat-issue); 
> 
> Any thoughts? 
> 
> Regards,
> Sergey. 
> 
> _______________________________________________
> nginx-devel mailing list -- nginx-devel at nginx.org
> To unsubscribe send an email to nginx-devel-leave at nginx.org
 

Links:
------
[1] http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
[2] http://nginx.org/en/docs/http/ngx_http_core_module.html#server
[3] http://nginx.org/en/docs/http/ngx_http_core_module.html#location
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20220824/8b596371/attachment.htm>


More information about the nginx-devel mailing list