You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx如何禁止目录文件直接访问但不拦截PHP触发的文件下载

答案

完全可以实现,配置逻辑很简单,两类请求的处理链路完全独立,不会互相干扰。

实现逻辑

  • 用户直接访问指定目录下文件的请求,是发给Nginx的静态资源请求,由Nginx直接处理返回结果。
  • 你贴的PHP代码触发的下载,用户实际请求的是PHP脚本地址(比如/down.php),Nginx会把这类请求转给PHP进程处理:PHP在服务端内部执行readfile()读文件,不管是拉取远程文件、还是读服务器本地受保护目录的文件,都属于服务端内部操作,根本不会走Nginx对外的HTTP访问规则匹配,最后由PHP把文件流返回给用户,全程碰不到静态目录的拦截规则。

你贴的示例代码是拉取远程服务器文件的场景,文件甚至不在当前Nginx服务器上,从机制上就不可能被本地目录拦截规则影响,完全可以正常运行。

配置方法

假设你要禁止用户直接访问站点根目录下的/protected_files/目录,在对应站点的Nginx server配置块里加如下规则就行:

# 拦截指定目录的所有直接访问请求
location ^~ /protected_files/ {
    deny all; # 默认返回403状态码
    # 如果不想让外人知道这个目录存在,可以改成返回404:return 404;
}

# 你原来的PHP请求转发配置不用改,常规配置参考如下
location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000; # 改成你自己实际的PHP-FPM监听地址
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

注意事项

别写全局后缀拦截规则(比如全局拦截所有.exe/.zip后缀请求),这类规则会匹配所有路径下的请求,很容易把PHP的正常请求也拦了。只要把拦截规则限定在指定目录的location块里,就不会影响PHP的下载逻辑。

配置写完先执行nginx -t检查语法有没有错,确认没问题重载Nginx就生效了,可以自己测两个场景验证:

  • 直接在浏览器访问http://你的域名/protected_files/xxx.exe,会返回403/404,拦截成功
  • 访问你写的PHP下载接口,文件能正常弹出下载,不受任何影响

内容的提问来源于stack exchange,提问作者Moritz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:45:51