Nested location block for merging config returns 404?

Valentin V. Bartenev vbart at nginx.com
Tue Jan 21 16:24:23 UTC 2014


On Tuesday 21 January 2014 08:29:18 WheresWardy wrote:
> I want a location to proxy to another service, and need to add an extra
> header for certain file types, but when trying to merge the configuration
> with a nested location instead of duplicating nginx instead returns a 404.
> 
> For example, this configuration works:
> 
> location ~ /(dir1/)?dir2/ {
>   add_header X-My-Header value1;
>   proxy_pass http://myproxy;
> }
> 
> location ~ /(dir1/)?dir2/.*\.(txt|css) {
>   add_header X-My-Static value2;
>   add_header X-My-Header value1;
>   proxy_pass http://myproxy;
> }
> 
> Passing valid URLs to the above config works perfectly, and I'll get the
> extra header set if it's a txt or css file (examples for the sake of
> argument). However, what I want to accomplish is to merge these two blocks
> into one nested location block to save on the duplication, however when I do
> that I just get a 404 returned for the previously workings URLs:
> 
> location ~ /(dir1/)?dir2/ {
>   location \.(txt|css) {
>     add_header X-My-Static value2;
>   }
>   add_header X-My-Header value1;
>   proxy_pass http://myproxy;
> }
> 
> Can location blocks actually be nested in this way? I'm wondering if the 404
> is because it's only parsing the specific nested block, and doesn't fallback
> onto the remaining config underneath (and therefore never gets sent to the
> proxy, and it's nginx returning a 404 which would be expected for that URL).
[..]

Yes, they can.  But, please note that the proxy_pass directive is not
inherited, and you should duplicate it in your nested location block.

There is a good article on the topic:
http://blog.martinfjordvald.com/2012/08/understanding-the-nginx-configuration-inheritance-model/ 

  wbr, Valentin V. Bartenev



More information about the nginx mailing list