phpEnv中.htaccess大概率不生效,因其Apache默认未启用mod_authz_host和mod_rewrite模块,且主配置中AllowOverride未设为All,导致.htaccess被直接忽略。

phpEnv 本身不提供「禁止访问目录」的图形化开关,所有目录级访问控制必须手动改 Web 服务器配置或加防护文件;PHP 层面的 open_basedir 或 header() 无法真正阻止对目录的 HTTP 请求到达。
为什么 .htaccess 在 phpEnv 里大概率不生效
phpEnv 的 Apache 默认未启用 mod_authz_host 和 mod_rewrite,.htaccess 文件会被直接忽略。即使你往 D:/phpEnv/www/uploads/ 里放了内容为 Deny from all 的 .htaccess,请求 http://localhost:8080/uploads/ 仍会列出文件列表或返回 403(取决于 Options -Indexes 是否生效)——但这不是因为你写了 .htaccess,而是因为 phpEnv 的 Apache 主配置里默认关了目录索引。
实操建议:
- 别花时间调试
.htaccess,先用命令行确认模块是否加载:phpEnv\apache\bin\httpd.exe -M | findstr authz,没输出就说明模块没启 - 若坚持用 Apache,直接改
phpEnv\apache\conf\httpd.conf,在对应<directory></directory>块里写Require local,比.htaccess可靠 - 更推荐切到 Nginx:phpEnv 新版默认带 Nginx,且配置更直白、模块无依赖
Nginx 下禁止访问特定目录(如 uploads/、config/)
Nginx 没有 .htaccess 概念,所有规则必须写进 server 块。禁止访问 /uploads/ 目录下的 PHP 文件,防止上传木马被执行,是最常见需求。
立即学习“PHP免费学习笔记(深入)”;
打开 phpEnv\nginx\conf\vhost\your-site.conf(或主 nginx.conf 中的 server 段),加这段:
location ^~ /uploads/ {
deny all;
}
location ~ ^/uploads/.*\.php$ {
deny all;
}
注意两点:
-
^~ /uploads/优先级高于正则,能快速拦截所有子路径请求 -
~ ^/uploads/.*\.php$单独拦截 PHP 文件,避免有人绕过第一层直接请求/uploads/shell.php - 如果还要禁止下载任意文件(如
.env、config.php),补上:location ~ \.(env|config|log|sql)$ { deny all; }
PHP 层 open_basedir 不是用来“禁止访问目录”的
open_basedir 是限制 PHP 脚本能 读写哪些磁盘路径,不是限制 HTTP 请求能否抵达某个 URL 路径。比如你设了 open_basedir = D:/phpEnv/www/public/,那么 file_get_contents('../config/database.php') 会报错,但用户照样能通过浏览器访问 http://localhost:8080/config/ —— 只要这个路径没被 Web 服务器规则拦住。
常见误用场景:
- 在
public/.user.ini里配了open_basedir,结果 ThinkPHP 报 500:因为框架入口要读../app/,而open_basedir锁死了只能读public/下的文件 - 以为设了
open_basedir就能防跨站,其实攻击者根本不需要执行 PHP,直接 GET 就能下载/config.php(如果目录没被 Nginx/Apache 拦) - 全局在
php.ini开open_basedir,导致 Composer、CLI 脚本全挂——它影响所有 PHP 进程,不只是 Web 请求
最易被忽略的权限组合:Web 根目录 + 上传目录
很多人只记得把 uploads/ 设成 755,却忘了两件事:
- Web 服务器用户(如
www-data或 Windows 下的当前登录用户)必须对uploads/有写权限,否则上传失败;但对uploads/下的.php文件,Nginx 必须拒绝执行——光靠文件权限做不到这点 -
uploads/的父目录(如www/)不能是777,否则攻击者可能通过目录遍历写入www/.htaccess或www/shell.php - Windows 下没有传统 chmod,但 phpEnv 启动时会以当前用户身份跑服务,所以重点是:别把项目放在
C:\Users\Public或共享文件夹里,这些位置默认局域网可读
真正的安全水位线不在 PHP 配置里,而在 Nginx/Apache 的 location 和 Require 规则里——它们才是第一道门,也是唯一一道能拦住 HTTP 请求的门。



















