Nginx: How to add headers to only specific files and text

I have multiple urls that needs to add same sets of header with nginx. Here is the file names.

File Group1
    https://www.example.com/news/2017-08-03/article-xyz/
    https://www.example.com/news/2017-08-03/article-xyz/topics/
    https://www.example.com/news/2017-08-03/article-xyz/gallery/

File Group2
    https://www.example.com/news/2017-08-02/article-abc/
    https://www.example.com/news/2017-08-02/article-abc/topics/
    https://www.example.com/news/2017-08-02/article-abc/gallery/

So in this case File Group1 needs:

add_header Cache-Tag  article-xyz;

And File Group2 needs:

add_header Cache-Tag  article-abc;

So nginx.conf should be something like this

  location /news/ {
        add_header Cache-Tag  article-abc;
    }

But how can I apply this dynamically in add headers?


One solution is to use a map directive on the $request_uri value. For example:

map $request_uri $cache_tag {
    default        "";
    ~/article-xyz/ "article-xyz";
    ~/article-abc/ "article-abc";
}
server {
    ...
    add_header Cache-Tag $cache_tag;
    ...
}

The map block lives outside the server block (as shown). The add_header statement can be in the server scope or in the location block which finally processes the request (subject to inheritance rules). See this and this for details.

Do not use captures in the map directive, as it will not work.