On Fri, Nov 23, 2018 at 03:38:27PM -0800, Roger Fischer wrote:
Hi there,
> how do I best handle multiple locations that use the same code block?
Repeat the {} part with all of the config.
Nginx cares what is in the config file; it does not care how the config
file is created. Use your favourite pre-processor/macro language to
create the config, if you don't want to type the same thing twice.
> I do not want to repeat the { … } part.
Put all of the repeat-config in a separate file, and repeat the {}
part that just contains "include separate-file;".
> Is there a way to do this with logical or between regular expressions?
Probably; but you will find it to be much more readable if you don't.
> The first variation is that sometimes there are query parameters, and
> sometimes there are not. The second variation is that there are multiple
> suffixes that should match the same block.
"location" matching does not consider query parameters. It stops before
the first ? or # in the uri.
> As an example, the following locations all should have the same behaviour:
> * /variable-part.gif
> * /variable-part.gif?variable-query-parameters
> * /variable-part.png
> * /variable-part.png?variable-query-parameters
>
> The equivalent regular expressions I am using are:
> * ~* \.gif$
> * ~* \.gif\?
> * ~* \.png$
> * ~* \.png\?
>
> I know, I can combine the different types:
> * ~* \.(gif|png)$
> * ~* \.(gif|png)\?
The ones with "\?" will not match the requests above.
> But I don’t know how to combine the end-of-uri with the
> followed-by-query-parameters into a single regex.
You don't need to.
(You *can* match end-of-string or following-character by using regex
alternation with |. You just do not need to in this particular case.)
> Lastly, I also have locations with a quite different pattern that has the
> same code block.
>
> So, what I would like is something like this:
>
> location ( ~* \.(gif|png)$ | ~* \.(gif|png)\? | = /xyz ) { … }
>
> “|” represents a logical or.
>
> Is there a way to do this?
No.
You can probably build one probably-very-complex regex to include
everything you want and to exclude everything you don't want; but you'll
be much happier in 6 months when you need to change something, if your
config is human-readable.
(The full efficiency effects of the nginx "=" match can't be achieved
with a regex match.)
> BTW, should the regular expression be in quotes (single or double)?
Only if it needs to be. (Which probably means "if it includes {".)
"nginx -t" will probably tell you if you got it wrong.
And it should be generally straightforward to test. Something like
location / { return 200 "no match\n"; }
location ~ x { return 200 "match no-quotes\n"; }
location ~ "y" { return 200 "match double-quotes\n"; }
location ~ 'z' { return 200 "match single-quotes\n"; }
and then make requests that include x, y, and z, and see if they are
each processed in the location that you expect they should be.
Good luck with it,
f
--
Francis Daly [email protected]
_______________________________________________
nginx mailing list
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx