nginx匹配网址,除非它包含子字符串

时间:2019-12-11 20:44:09

标签: regex nginx

我正在准备一个nginx HTML缓存,该缓存使用map白色列出的URL来确定哪些页面是缓存安全的。

除非字符串中有edit字样,否则某些页面可以缓存。

例如:/users/123将可以安全地缓存;但是,/users/123/edit缓存不安全

地图如下:

map $request_uri $skip_cache_whitelist {
    default 1;
    ~^/index.php 0;
    / 0;
    ~^/browse 0;
    ~^/contact 0;
    etc.

我尝试的方法如下:

~^/users(?!edit) 0;
~(^/users)(?!edit) 0;
~(?!edit)[^users] 0;

没有一项工作。

1 个答案:

答案 0 :(得分:1)

您提出的解决方案是带有负超前断言的正则表达式。您当前的尝试无法解决/123/users子字符串之间的edit

我已经测试了以下内容:

map $request_uri $skip_cache_whitelist {
    default 1;
    ...
    ~^/users(?!.*edit) 0;
    ...
}

map中的正则表达式将按顺序求值,直到找到匹配项为止。因此,否定超前断言的另一种选择是两个正则表达式,其中更具体的出现在最前面。

例如:

map $request_uri $skip_cache_whitelist {
    default 1;
    ...
    ~^/users/.*/edit 1;
    ~^/users         0;
    ...
}
相关问题