Nginx日志排除.json扩展名失败,多规则冲突如何解决?
问题原因及解决方法
没错,问题就出在那两条独立的.json规则上。Nginx处理正则型location的逻辑是:按配置文件里的顺序依次匹配,只要找到第一个能匹配请求的正则location,就会完全使用它的配置,后续同类型规则不再生效。
你的情况是,针对.json文件存在两条正则匹配规则:一条是关闭访问日志,另一条是添加缓存头。不管这两条规则的顺序如何,都会导致其中一条的配置被忽略——比如如果添加缓存头的规则在前,请求匹配到它之后,就不会再应用后面关闭日志的规则;反之如果关闭日志的规则在前,缓存头的配置就不会生效。
解决步骤
把两条规则合并到同一个location块里,同时配置access_log off和add_header:
location ~* \.(woff|jpg|jpeg|png|gif|ico|css|js|json)$ { access_log off; add_header Cache-Control "must-revalidate"; }
或者如果你想把.json单独拆分出来(比如后续有其他专属配置),也可以单独写一个.json的location,同时包含两个配置:
# 先处理其他静态资源 location ~* \.(woff|jpg|jpeg|png|gif|ico|css|js)$ { access_log off; } # 单独处理json,同时关闭日志+添加缓存头 location ~* \.json$ { access_log off; add_header Cache-Control "must-revalidate"; }
这样就能同时实现关闭.json文件的访问日志,以及添加指定的缓存头了。
注意:如果你的配置里还有其他可能匹配.json请求的location(比如前缀匹配的/api/之类的),要确保正则匹配的location优先级更高——不过这里用的是~*正则匹配,优先级高于普通前缀匹配,所以只要顺序没问题就不会有问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

