配置Nginx限制文件夹访问后JPG/PNG仍可访问的问题求助
问题原因
Nginx的正则location匹配遵循配置文件中的书写顺序,哪个正则规则先被匹配到,就优先执行该规则的逻辑。你的配置中,处理图片类型(gif/jpg/png等)的location写在了限制目录的location之前,导致访问data/等受限目录下的图片时,会先命中图片缓存规则,跳过了deny all的拦截逻辑,所以图片能正常加载,而其他未被提前匹配的文件类型则被拦截。
解决办法
方法一:调整Location顺序(推荐)
将限制目录的location移到所有正则匹配的location(图片、JS/CSS等)之前,确保受限目录下的所有请求优先被拦截。修改后的配置片段如下:
location ~ /(data|conf|bin|inc|vendor)/ { deny all; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; error_log /dev/null; access_log /dev/null; } location ~ .*\.(js|css)?$ { expires 12h; error_log /dev/null; access_log /dev/null; }
方法二:在资源Location中添加目录判断
如果不想调整顺序,可以在图片、JS/CSS的location中增加判断,若请求路径包含受限目录则直接拦截。示例:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { if ($uri ~* /(data|conf|bin|inc|vendor)/) { deny all; } expires 30d; error_log /dev/null; access_log /dev/null; } location ~ .*\.(js|css)?$ { if ($uri ~* /(data|conf|bin|inc|vendor)/) { deny all; } expires 12h; error_log /dev/null; access_log /dev/null; } location ~ /(data|conf|bin|inc|vendor)/ { deny all; }
注意:Nginx官方不推荐过多使用
if指令,方法一的顺序调整更符合Nginx的执行逻辑,性能更优。
修改完成后,执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者Zhang Mike
相关产品推荐
相关产品推荐

