禁止直接访问php文件需由web服务器在请求到达php解析器前拦截,apache用.htaccess或虚拟主机配置(如 require all denied),nginx需在server块中添加location规则(如location ~ ^/(?!index.php).+.php$ { return 404; }),并辅以php层路径校验与php.ini安全设置。

禁止直接访问 PHP 文件,本质是防止用户通过 URL(如 https://yoursite.com/config.php)下载或执行敏感脚本。这不能靠 PHP 自身“关闭”实现,而要由 Web 服务器(Apache 或 Nginx)在请求到达 PHP 解析器前就拦截或拒绝。
Apache 环境:用 .htaccess 或虚拟主机配置
在网站根目录或需保护的子目录下创建或编辑 .htaccess 文件,加入以下规则:
-
完全禁止访问所有 .php 文件(含下载和执行):
RedirectMatch 404 \.php$
或更明确地:<files><br> Require all denied<br></files>
-
只禁下载、允许执行(不推荐):
<files><br> SetHandler application/x-httpd-php<br></files>
但此方式无法阻止恶意请求绕过,且实际意义有限。 - 确保 Apache 已启用
mod_rewrite,且对应目录的AllowOverride All生效,否则 .htaccess 不起作用。
Nginx 环境:必须改 server 配置,无 .htaccess
进入宝塔面板 → 网站 → 设置 → 配置文件,在 server 块内添加(放在 location ~ \.php$ 之前):
-
禁止访问特定目录下的 .php 文件(如 /config/):
location ^~ /config/ {<br> location ~ \.php$ { deny all; }<br>} -
全局禁止直接访问任何 .php 文件(除入口 index.php 外):
location ~ ^/(?!index\.php).+\.php$ {<br> return 404;<br>}
注意:此写法需配合正确的 FastCGI 转发逻辑,避免误杀合法路由。 - 修改后务必执行
nginx -t检查语法,并重载配置:systemctl reload nginx或在宝塔点击「重载配置」。
PHP 层补充防护:防 include 路径穿越
Web 服务器拦截的是 HTTP 请求,但 PHP 脚本仍可能因代码缺陷(如 include $_GET['file'])读取不该访问的文件。需在代码中加固:
- 对用户输入的文件名严格过滤:
basename($_GET['file']) - 限定白名单:
in_array($file, ['header', 'footer'], true) - 使用
realpath()校验路径是否落在预期目录内:$abs = realpath($user_path);<br>if (strpos($abs, '/www/wwwroot/myapp/') !== 0) die('Access denied');
额外建议:关闭 PHP 文件索引与信息暴露
在 php.ini 中确认已设置:
-
expose_php = Off(隐藏 PHP 版本头) -
display_errors = Off(生产环境禁用错误输出) - Apache 主配置中确保
Options -Indexes,防止目录被列出来
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











