如何修改Nginx配置以阻止.well-known目录下所有PHP文件访问并返回HTTP 403状态码
如何修改Nginx配置以阻止.well-known目录下所有PHP文件访问并返回HTTP 403状态码
针对你的需求,我整理了两种可靠的配置方案,都能实现拦截.well-known目录及其子目录下所有PHP文件访问并返回403的效果,你可以根据自己的维护习惯选择:
方案一:在现有location块内嵌套规则(推荐)
这种方式把相关规则集中在一起,更便于后续维护,而且利用Nginx的嵌套location匹配逻辑,能确保PHP请求被优先拦截。
修改后的完整配置如下:
location ^~ /.well-known/ { allow all; default_type "text/plain"; root /var/www/example.com/_well-known/; try_files $uri/ $uri =404; # 新增:拦截该目录下所有PHP文件请求,直接返回403 location ~* \.php$ { return 403; } }
原理说明
- 外层的
location ^~ /.well-known/会优先匹配所有以.well-known/开头的请求,确保这些请求不会被其他location规则干扰。 - 嵌套的
location ~* \.php$是不区分大小写的正则匹配,会捕获所有.well-known目录下(包括子目录)以.php结尾的请求,直接返回403状态码,不会走后续的try_files逻辑。
方案二:添加独立的location块
如果你不想修改原有的.well-known配置块,可以单独新增一个规则,专门拦截PHP请求:
# 先拦截.well-known下的所有PHP文件请求 location ~* ^/.well-known/.*\.php$ { return 403; } # 保留你原有的.well-known配置 location ^~ /.well-known/ { allow all; default_type "text/plain"; root /var/www/example.com/_well-known/; try_files $uri/ $uri =404; }
注意事项
- 这个正则匹配的location必须放在原有
.well-known配置的前面,因为Nginx会按顺序检查正则location规则,先匹配到的会生效。 - 正则
^/.well-known/.*\.php$会精准匹配所有.well-known目录及其子目录下的PHP文件请求。
配置验证与生效
不管用哪种方案,修改完配置后都要先验证配置是否合法:
sudo nginx -t
如果提示test is successful,再重载Nginx使配置生效:
sudo systemctl reload nginx
这样配置后,任何访问.well-known下PHP文件的请求都会收到403 Forbidden响应,而你原本的合法文件请求依然可以正常处理。
备注:内容来源于stack exchange,提问作者Pete Cooper




