防止 Nginx 正则表达式规则覆盖另一条规则

防止 Nginx 正则表达式规则覆盖另一条规则

我有一个 Nginx 服务器,充当几个服务的反向代理,其配置与此类似

location /backend/service1 {
        proxy_pass http://pathto/service1;
}

location / {
        root /a/folder
}

location ~* (\.js|\.css)$
        expires 8d;

        root /home/files/abc/bcd;
}

我的问题是,最近后端的 service1 必须提供几个静态文件,例如/backend/service1/something/file1.js/backend/service1/something/style.css和第二个位置,因为它是一个正则表达式位置规则,所以会覆盖第一个位置

backend/service1 提供的所有静态文件都有特定的前缀(something),所以我尝试从第二个位置改进正则表达式以进行负向前瞻/后瞻,但它似乎不起作用,可能是因为主模式必须具有固定长度(这是我尝试过的,但没有成功)

location /backend/service1 {
        proxy_pass http://pathto/service1;
}

location / {
        root /a/folder
}

location ~* (?<!something)(.*)(\.js|\.css)$
        expires 8d;

        root /home/files/abc/bcd;
}

我怎样才能实现这个目标?

答案1

如果紧接着“某些内容” /backend/service1,则可以添加另一个更具体的location、优先于正则表达式位置的内容:

location /backend/service1 {
    proxy_pass http://pathto/service1;
}  
location ^~ /backend/service1/something/ {
    proxy_pass http://pathto/service1/something/;
}  
location ~* \.(js|css)$ { ... }

如果“某物”嵌入在 URL 中的任何位置,则需要使用正则表达式,可能使用臭名昭著负向前瞻。通过反复试验,我找到了一个可行的表达式:

location ~* ^(?!.*something).*\.(js|css)$ { ... }

答案2

我接受了另一个答案,但对我的情况也有效的是嵌套包含正则表达式的位置。像这样

location /backend/service1 {
        proxy_pass http://pathto/service1;
}

location / {
        location / {
            root /a/folder
        }

        location ~* (\.js|\.css)$
            expires 8d;

            root /home/files/abc/bcd;
        }
}

这样,如果目标 URI 以 /backend/service1 为前缀,则第一个位置将触发,对于任何其他位置,/ 位置将触发,然后正则表达式即可生效

相关内容