Nginx location正则如何匹配含动态可空前缀的/staticpath/路径?
问题原因
你原有正则匹配规则的核心问题是:
- 分组
(.*/)为必选匹配,当something为空(即访问路径为/staticpath/)时,没有对应内容匹配该分组,导致该场景匹配失败 - 默认
.*为贪婪匹配,若路径中存在多个staticpath字段时会出现非预期的匹配结果
正确匹配规则
location ~ ^/(?:.*?/)?staticpath/ { index index.html index.htm; root /usr/share/nginx/html/; }
规则说明
?:表示非捕获组,避免不必要的分组捕获占用服务内存.*?为非贪婪匹配,仅匹配到最近的一个/为止,避免多段路径匹配异常- 末尾的
?表示该分组可选,可适配something为空的场景,正常匹配/staticpath/路径 - 若需要仅匹配路径以
staticpath/结尾的请求,可在正则末尾添加$,即规则改为^/(?:.*?/)?staticpath/$
补充提示
如果你需要不管前面的something取值是什么,所有匹配到*/staticpath/的请求都指向同一个固定目录,不要使用root指令,替换为alias即可,示例:
location ~ ^/(?:.*?/)?staticpath/ { index index.html index.htm; alias /usr/share/nginx/html/staticpath/; }
内容的提问来源于stack exchange,提问作者krishh
相关产品推荐
相关产品推荐

