4

I've spent some time trying to find the answer before writing this question:

I have several location blocks in my nginx config file that look like this:

location ~ ^/(doc|img|bla|foo)/metadata/$ { ... }

location ~ ^/(doc|img|bla|foo)/deleted/$ { ... }

location ~ ^/(doc|img|bla|foo)/something/$ { ... }

So I thought it would be a good idea to refactor the repeated regular expression into a variable that I set in the server section (also because I know I'll have to add to it in the future), like so:

server {
     set $my_regex doc|img|blah|foo;

     # I also tried this one:
     set $my_regex "doc|img|blah|foo";
     ....
}

Which I would then reuse inside the location blocks:

# this doesn't have any effect
location ~ ^/($my_regex)/metadata/$ { ... }

# this one neither
location ~ ^/(\$my_regex)/deleted/$ { ... }

# and this one neither
location ~ ^/(${my_regex})/something/$ { ... }

Any idea? Thanks!

jfix
  • 211
  • 1
  • 2
  • 3
  • Greetings! Just interesting: did You try to combine two expressions in one? `location ~ ^/(doc|img|bla|foo)/(metadata|deleted|something)/$ { ... }` – Sergey Serov Feb 20 '18 at 17:39
  • @SergeySerov No, I'm not going that far. I'm just trying to refactor the regular expression that has been used three times by assigning it to a variable that I then would like to use in the `location` directive. – jfix Feb 20 '18 at 17:59
  • @SergeySerov Actually I now have combined them into one, and use a `rewrite`. But that doesn't solve the initial problem. :-) – jfix Feb 20 '18 at 22:15
  • Now You have one line instead three, this is good already. Yes, the task with string variable not resolved yet. It is interesting task for me too ;) – Sergey Serov Feb 20 '18 at 22:29

2 Answers2

2

There is no way to use variables in location matching.

If you want it, you probably doing something wrong. In this case you could try nesting locations.

Alexey Ten
  • 8,435
  • 1
  • 34
  • 36
  • @AlexeyTan I've reduced the use of the regex to only two occurrences which will make the pain of maintaining somewhat more bearable. But I guess I have to find another solution, maybe scripting? – jfix Feb 20 '18 at 22:16
0

Please check at this link as they said in NGINX documentation

The PCRE library supports named captures using the following syntax:

?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name>    Python compatible syntax, supported since PCRE-4.0

Named captures are a feature of PCRE and they have different syntax available in different versions. For the syntax you use ? you must have PCRE 7.0 at least.

Alvaro Niño
  • 359
  • 2
  • 6
  • I don't think I'm looking for named captures. From what I understand, named captures allow to reference a matched part of a regex by name rather than by a numeric index in later processing. Here however I'm looking for the possibility to reuse an existing variable inside a regex. Maybe that's just not possible? – jfix Feb 20 '18 at 17:25