apache用.htaccess禁止访问需设allowoverride all并放于目标目录;nginx用location ^~ /path/ {return 403;};php中禁用display_errors、避免echo路径、敏感目录移出document_root;iis需在请求筛选中屏蔽.env等文件。

Apache环境下用.htaccess禁止访问文件夹
PHP本身不负责隐藏文件夹,真正起作用的是Web服务器配置。Apache最常用的方式是在目标文件夹里放一个.htaccess文件,内容写死拒绝所有访问。
常见错误是只写了Deny from all却没开AllowOverride All,结果完全不生效;或者把.htaccess放错位置(必须放在要隐藏的文件夹根目录,不是网站根目录)。
-
.htaccess内容只需两行:Order deny,allow<br>Deny from all
- 确认Apache配置中对应目录的
AllowOverride设为All,否则.htaccess被忽略 - 如果文件夹里有
index.php等入口,且你又想让PHP脚本内部能读取它——没问题,.htaccess只拦HTTP请求,不影响file_get_contents()或include
Nginx下用location块屏蔽文件夹路径
Nginx没有.htaccess机制,必须改主配置或server块。直接在server配置里加location规则,匹配到就返回403。
容易踩的坑是路径匹配不精确:比如写location /config/,结果/config-bak/也被误伤;或者忘了加尾部斜杠,导致/config.php漏掉。
立即学习“PHP免费学习笔记(深入)”;
- 推荐写法:
location ^~ /private/ {<br> return 403;<br>}其中^~表示前缀匹配且不回退,比~正则更高效 - 若要屏蔽多个路径,不要堆砌多个
location,改用map+return更清晰 - 修改后必须
nginx -t && nginx -s reload,热重载不生效等于没改
PHP代码里避免暴露敏感路径的惯用做法
很多人以为“文件夹藏好了就安全了”,其实PHP脚本里硬编码路径、拼接$_SERVER['DOCUMENT_ROOT']、或直接echo __DIR__都可能把真实路径打到页面上——尤其开启display_errors时,报错信息会泄露完整路径。
典型场景:调试时临时var_dump(__DIR__)忘了删;或用realpath('../config')计算路径后直接输出;再或者把include失败的错误原样显示给用户。
- 上线前务必关掉
display_errors,用log_errors记日志 - 路径相关变量别直接
echo,调试用error_log()写到日志文件 - 敏感目录如
/config/、/vendor/,建议从DOCUMENT_ROOT之外的位置加载,比如require '/var/www/shared/config.php';
Windows IIS里禁用目录浏览和路径访问
IIS默认不开目录浏览,但如果你手动开过,或者用了URL重写模块,就可能意外暴露。关键不是PHP怎么写,而是IIS管理器里的两个开关。
常见错误是只关了“目录浏览”,却没检查“请求筛选”里的隐藏文件规则,导致.env、.git这类文件仍可直连下载。
- 在IIS管理器中,选中站点 → “请求筛选” → “隐藏文件”选项卡 → 确保
.env、.git、.htaccess等已勾选 - “处理程序映射”里检查有没有把
*.*通配符映射到PHP处理器——这会导致/config/db.php被当成PHP执行并输出源码(如果没配置好) - 用
appcmd list config "站点名" /section:security命令行快速核对安全配置是否生效
chmod 750),后者靠Web服务器规则。两者得一起设,缺一不可。











