# ============================================================================
# QiLog · data/ 目录访问保护（随包分发；安装器也会在缺失时自动补写一份）
# ============================================================================
# data/ 里同时住着「必须公开」与「绝不能公开」两类文件：
#   公开：uploads/  —— 文章插图，前台 <img src> 要能取到
#   机密：config.php（数据库凭据）
#         backups/   —— 全库 .sql 与整站 .zip
#         logs/      —— 含绝对路径与 SQL 片段的报错日志
#         sessions/  —— 会话文件（配合 Cookie 可读会话）
#         mailqueue/ —— 待发邮件（收件人地址与正文）
# 只要其中任何一处能被 Web 直接 GET，就等于全站失守。
#
# ⛔ 为什么不用一句 `Require all denied`：
#    Apache 2.4 的授权指令在子目录会与父级「合并」而非「覆盖」，
#    uploads/ 里再写一条 `Require all granted` 未必能盖过父级的 denied，
#    行为还取决于 AllowOverride 的配置 —— 不可靠。
#    这里改用两条正交规则，结果确定、不依赖继承：
#      (1) 按目录拒 —— 敏感的整目录一律 403（uploads 不在名单内）
#      (2) 按后缀拒 —— 脚本 / 备份 / 日志 / 凭据类扩展名一律 403
#
# 自测（部署后须逐条验证）：
#   curl -sI https://你的域名/data/backups/任意.sql   → 403
#   curl -sI https://你的域名/data/uploads/任意.jpg   → 200
#   curl -sI https://你的域名/data/config.php         → 403
#   Nginx 主机请看包内 nginx.htaccess 的【A】段（需手工粘贴，nginx 不读本文件）
# ============================================================================

# (1) 敏感子目录：整目录拒绝
#     ⚠️ 用相对路径（不带前导 /），这样站点装在子目录（/blog/）下同样正确；
#        本文件所属目录即匹配基准，因此无需 RewriteBase。
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(?:backups|logs|sessions|cache|tmp|files|mailqueue)(?:/|$) - [F,L]
</IfModule>

# (2) 敏感文件类型：按后缀拒绝（未开 mod_rewrite 时的兜底，也能独立拦住 .sql/.log/.zip）
<FilesMatch "(?i)\.(?:php\d*|phtm|phtml|pht|phar|inc|cgi|pl|py|sh|sql|log|zip|gz|tar|bak|ini|conf|lock|json|md|txt)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# (3) 隐藏文件（.htaccess / .user.ini 等）本身也不该可读
<FilesMatch "(?i)^\.">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>
