发布于2026-07-05 阅读(0)
扫一扫,手机访问
必须禁用 Web 服务器目录列表,并显式拦截敏感路径,因为 ThinkPHP 控制不了静态文件访问。Apache 要删掉Options Indexes并配置Require all denied,Nginx 需设autoindex off及location ^~ /app/ { return 403; }等规则。

先别急着把锅甩给框架——目录列表浏览(Directory Listing)是由 Apache 的 Options Indexes 或 Nginx 的 autoindex on 触发的,和 PHP 入口文件、中间件、路由完全沾不上边。这不是 ThinkPHP 能防住的问题,而是 Web 服务器配置必须关掉的功能。
.htaccess 的力量有限:它只对当前目录及其子目录生效,而且仅在 Apache 启用了 AllowOverride All 时才会被读取。假如你把 Web 根目录设在项目根(比如 /var/www/myapp/),那么 app/、config/ 就和 public/ 同级,public/.htaccess 根本不会覆盖它们。
常见错误做法包括:
public/.htaccess 能拦住上层目录config/ 目录里随手放一个 .htaccess,却没确认服务器是否真的启用了 AllowOverridedeny from all 写在项目根的 .htaccess 里,忘了它对 ../config/ 这类路径根本无效Nginx 不支持 .htaccess,所有改动都必须直接修改站点配置。关键不是“隐藏”,而是“拒绝访问”:
autoindex on,有则改成 autoindex offlocation ^~ /app/ { return 403; }location ^~ /config/ { return 403; }、location ^~ /runtime/ { return 403; }location ^~ /common/ 和 location ^~ /extend/(如果存在)注意这里用 ^~ 是前缀匹配,优先级高于正则,比单纯写 location /app/ 更可靠;而 return 403 比 deny all 更明确,不依赖 allow/deny 的指令顺序。
检查虚拟主机配置或项目根目录下的 .htaccess,找到所有含 Options Indexes 的行并删掉。正确的写法是:
Options -Indexes(减号表示禁用)Options None,再按需开启 FollowSymLinks 等必要项 Require all denied 务必记住:只在 public/ 里写 Options -Indexes 是没用的——它对同级的 app/ 完全无效。
最后提一个最容易忽略的点:ThinkPHP 的 index.php 入口只处理能被路由识别的请求(比如 /index.php/user/login),而直接 GET /config/database.php 是静态文件请求,根本不会进入 PHP 执行,更不可能经过任何中间件或配置。验证方法很简单:curl -I http://yoursite.com/config/database.php,只要返回 200 就已经泄露无疑了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8