Nginx location块支持哪些正则?请求匹配失败报404求助
一、Nginx Location块支持的正则表达式模式
先给你梳理下Nginx里location可用的匹配规则,按优先级从高到低排序:
- 精确匹配(=):用
=前缀,比如location = /login { ... },只有当请求路径完全和配置的路径一致时才匹配,优先级最高,适合首页、固定路径的接口。 - 前缀优先匹配(^~):用
^~前缀,比如location ^~ /static/ { ... },如果请求路径以该前缀开头,会直接使用这个location,不再检查后续的正则匹配,优先级高于正则匹配。 - 区分大小写正则匹配(~):用
~前缀,比如location ~ \.php$ { ... },匹配符合正则表达式的请求,区分大小写。 - 不区分大小写正则匹配(~*):用
~*前缀,比如location ~* \.(png|jpg)$ { ... },功能和~类似,但不区分大小写。 - 普通前缀匹配:不带任何修饰符,比如
location / { ... },匹配所有以指定路径开头的请求,优先级最低,作为兜底配置。
二、解决你的404请求匹配问题
先分析你的问题:请求localhost:80/client/images/card.png返回404,错误信息显示Nginx去html/client/images/card.png找文件,说明你的第二个正则location完全没匹配上,请求落到了第一个兜底的location /里。
问题出在哪?
你的正则location ~/.*/images/写法有误:
Nginx的正则location语法是~ 正则表达式,你写的~/.*/images/会被解析成用/作为正则的分隔符,导致实际匹配的内容不符合预期,自然匹配不到/client/images/card.png。
修正方案
给你两个可行的修正方式,选一个就行:
方案1:修正正则表达式写法
把正则location改成正确的格式,锚定路径开头并精准匹配包含/images/的路径:
location ~ ^/.*/images/ { root C:/web; }
或者更精准地匹配/client/images/开头的请求(效率更高):
location ~ ^/client/images/ { root C:/web; }
方案2:改用前缀优先匹配(更高效)
如果你的图片路径都是固定前缀的,完全不需要用正则,用^~前缀匹配更高效,性能比正则好:
location ^~ /client/images/ { root C:/web; }
验证修正效果
修正后,Nginx会匹配到这个location,把请求路径/client/images/card.png拼接到root C:/web后面,也就是去C:/web/client/images/card.png找文件,正好符合你的预期,404问题就解决了。
另外补充下root和alias的区别:如果你的图片实际存在C:/web/images/card.png而不是C:/web/client/images/card.png,那你应该用alias C:/web/images/代替root C:/web,这点要根据你的实际文件存储路径调整。
内容的提问来源于stack exchange,提问作者user679526

