Apache通过多个独立且路径更精确的Directory块,依最长路径匹配规则实现父子目录差异化权限控制;上传目录须用FilesMatch显式拒绝脚本访问,并显式设置AllowOverride None和Require all granted以防止继承漏洞。

在 Apache 的 `
用多个 Directory 块按路径精度区分权限
比如站点根目录 `/var/www/example.com/public_html` 需要正常执行 PHP,但其下的 `/uploads` 子目录必须禁止脚本执行——这时不能在一个块里“条件判断”,而应定义两个独立块:
- 主目录块:开放常规功能,如 `Options +FollowSymLinks -Indexes`、`AllowOverride All`、`Require all granted`
-
上传子目录块:路径更长(`/public_html/uploads`),覆盖父级设置,禁用执行能力,并用 `
` 精准拦截危险后缀
上传目录必须禁用脚本解析,不能只靠 Options
`Options -ExecCGI` 或 `-Includes` 并不能完全阻止 PHP 文件被执行(尤其当 PHP 以模块方式运行时)。真正可靠的做法是结合 `
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 写法示例:
<FilesMatch "\.(php|pl|py|jsp|asp|sh|cgi|rb)$"> Require all denied </FilesMatch> - 该规则必须放在对应 `
` 块内部,且路径为绝对路径(如 /var/www/example.com/public_html/uploads) - 注意正则末尾不要加
/,否则会匹配失败;扩展名之间用竖线|分隔,不加空格
确保权限逻辑不被意外继承或覆盖
Apache 权限默认“由外向内继承”,但子目录块若没写全指令,可能漏掉关键限制:
- 子目录 `
` 中必须显式写 `AllowOverride None`,避免 `.htaccess` 绕过限制 - 不要依赖父块的 `Require all granted`,子目录块需单独声明 `Require all granted`(仅允许读取静态文件),再叠加 `
` 拒绝脚本 - 如果父目录用了 `Require ip 192.168.0.0/16`,子目录块没写 `Require`,就会继承该规则——可能导致上传目录无法被外部用户查看已上传图片
验证配置是否生效
改完配置别直接 reload,先做两步检查:
- 运行
apachectl configtest确认语法无误(常见错误:路径少引号、`` 正则括号不闭合、`Require` 写成旧版 `Allow from`) - 重启后,手动上传一个
test.php到 uploads 目录,用浏览器访问https://yoursite.com/uploads/test.php—— 应返回 403,而非显示源码或执行结果 - 同时确认正常图片(如
logo.png)仍可访问,说明 `Require all granted` 生效,只是脚本被精准拦截

















