apache不自动阻止php文件直接访问,须显式配置:用filesmatch禁止扩展名访问、directory禁用php解析并配合filesmatch、或最根本地将敏感文件移出web根目录。

Apache本身不自动阻止对PHP文件的直接访问,必须通过显式配置来实现。关键不是“不让用户看到”,而是“不让服务器执行或提供源码”——否则攻击者可能下载到含数据库密码的config.php,或触发恶意脚本。
用FilesMatch禁止特定扩展名访问
这是最常用、最稳妥的方式,适用于.htaccess或虚拟主机配置中:
- 在需要保护的目录(如/config/、/includes/)下新建或编辑.htaccess,加入:
Order allow,deny
Deny from all
- (?i:...)表示不区分大小写,覆盖.php、.PHP、.Php等变体
- 可按需增删后缀,比如加.sql防数据库备份泄露,加.yml防Laravel/.env配置暴露
- 该规则只拦HTTP请求,不影响PHP内部include或require
用Directory禁用整个目录的PHP解析
适合上传目录、静态资源目录等“本就不该运行PHP”的位置:
- 在httpd-vhosts.conf或主配置中添加:
php_flag engine off
Order allow,deny
Deny from all
- php_flag engine off让Apache停止解析PHP,但用户仍可能下载源码——所以必须配合FilesMatch彻底拒绝
- 若用.htaccess方式,需确保AllowOverride All已启用,否则会被忽略
把敏感文件移出Web根目录
这是最根本的安全做法,比任何规则都可靠:
- 将config.php、database.ini等放在/var/www/config/(不在/var/www/html/下)
- 在PHP代码中用绝对路径包含:require '/var/www/config/database.php';
- 这样即使URL被猜中,Apache也完全无法响应——因为路径不在DocumentRoot内
- 主流框架(如Laravel、ThinkPHP)默认采用public/入口模式,正是基于此原则
补充:避免常见误区
有些做法看似安全,实则无效或有副作用:
- 仅用Options -Indexes:它只隐藏目录列表,对已知文件URL(如/config.php)完全无效
- 只写php_flag engine off:用户仍能用浏览器下载PHP文件,看到明文密码
- 在根目录放全局.htaccess禁止所有.php:会误杀index.php等合法入口,导致网站无法访问
- 依赖RewriteRule ... [F]拦截:需开启mod_rewrite,且正则易漏匹配(如.pHp),不如FilesMatch直接
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











