![防止 Nginx 正则表达式规则覆盖另一条规则](https://linux22.com/image/774666/%E9%98%B2%E6%AD%A2%20Nginx%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%A7%84%E5%88%99%E8%A6%86%E7%9B%96%E5%8F%A6%E4%B8%80%E6%9D%A1%E8%A7%84%E5%88%99.png)
我有一个 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 为前缀,则第一个位置将触发,对于任何其他位置,/ 位置将触发,然后正则表达式即可生效