Apache中防止特定目录脚本执行的核心方法是在主配置中用或禁用解析器、关闭执行权限并阻止访问敏感后缀,如RemoveHandler、Options -ExecCGI -Includes、Require all denied等。

要防止 Apache 特定目录下的脚本(如 .php、.pl、.py 等)被执行,核心思路是禁用该目录的脚本解析能力,而非仅靠文件权限或隐藏文件。这需在 httpd.conf 或虚拟主机配置中,针对目标目录使用 <directory></directory> 指令配合 AddHandler、RemoveHandler 或 SetHandler 控制解析行为,并辅以 Options -ExecCGI -Includes 等限制。
以下是具体、可直接生效的配置方式:
明确禁止特定目录执行脚本
假设你要保护 /var/www/html/uploads/ 目录,禁止其中所有 PHP、Perl、Python 脚本运行:
<Directory "/var/www/html/uploads">
# 禁用所有脚本解析器
RemoveHandler .php .php3 .php4 .php5 .phtml .php7 .php8
RemoveHandler .pl .cgi .py .rb .sh
# 强制将这些后缀当作普通文件下载(可选,增强防护)
<FilesMatch "\.(php|pl|cgi|py|rb|sh)$">
ForceType application/octet-stream
</FilesMatch>
# 关闭执行权限和服务器端包含
Options -ExecCGI -Includes -Indexes
AllowOverride None
Require all granted
</Directory>✅ 关键点说明:
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RemoveHandler比AddHandler none更可靠,它从全局处理器映射中移除关联,避免被其他模块覆盖;ForceType application/octet-stream使浏览器不执行、只下载(防止 MIME 类型绕过);Options -ExecCGI -Includes同时禁用 CGI 执行和 SSI(服务器端包含),堵住常见执行入口;AllowOverride None防止.htaccess文件绕过此限制。
针对上传目录的强化建议(典型场景)
用户上传的文件常存于 uploads/、files/、attachments/ 等目录,这类路径必须默认禁用执行:
<DirectoryMatch "/(uploads|files|attachments|cache)/">
Options -ExecCGI -Includes -FollowSymLinks
AllowOverride None
Require all granted
# 可选:进一步限制只允许静态资源
<FilesMatch "\.(php|phtml|php3|php4|php5|php7|php8|pl|py|rb|sh|cgi|exe|bat|cmd)$">
Require all denied
</FilesMatch>
</DirectoryMatch>⚠️ 注意:
<directorymatch></directorymatch>是正则匹配,适用于多级或命名不固定的上传目录;Require all denied比Deny from all(旧语法)更安全且兼容 Apache 2.4+。
配合系统层加固(非配置但关键)
- 确保上传目录的文件系统权限为
644(文件)和755(目录),绝不设为 777; - Web 用户(如
www-data或apache)对上传目录无写入权限以外的执行权限(Linux 下可通过setfacl -m u:www-data:x /path控制,但更推荐用noexec挂载选项); - 若使用 PHP,可在
php.ini中设置disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,作为纵深防御。
不复杂但容易忽略:仅靠 .htaccess 或前端过滤无法阻止服务器端执行,必须在主配置中锁定目录行为。


















