# ============================================================================
# NiuNiuCms Apache 侧安全基线（2026-08-29 安全修复轮；根 .htaccess 此前为 1 字节空文件）
# 说明：宝塔 Nginx 部署不读取本文件——nginx 侧规则见 .skills/deploy/nginx.example.conf
# 若 AllowOverride 未开启，本文件不生效（属纵深防御补位，不替代 web 层配置）
# ============================================================================

Options -Indexes

# ---------- 敏感目录：仅允许本机 include，HTTP 直接访问一律 404 ----------
# task/ 含 Go 调度器源码（内含数据库连接串形态），.agent/ 为内部审计文档
# 注：.htaccess 语境下 RewriteRule 匹配的 URI 不带前导斜杠
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule (?i)^(core|runtime|tests|task|route|model|lang|config|\.agent|\.domian|\.git|\.svn)(/|$) - [R=404,L]
# 上传目录禁止执行 PHP
RewriteRule (?i)^upload/.*\.(php|phtml|phar) - [F,L]
</IfModule>

# ---------- 文件类型级封禁（覆盖任意位置，如 domian/main.go） ----------
<IfModule mod_authz_core.c>
<FilesMatch "(?i)\.(go|conf|sql|log|lock|bak|old|tmp|swp|ini|env|sh|py|rdb|tar|gz|key|pem|crt|md|json)$">
    Require all denied
</FilesMatch>
<FilesMatch "^\.">
    Require all denied
</FilesMatch>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2 回退语法
<FilesMatch "(?i)\.(go|conf|sql|log|lock|bak|old|tmp|swp|ini|env|sh|py|rdb|tar|gz|key|pem|crt|md|json)$">
    Order allow,deny
    Deny from all
</FilesMatch>
<FilesMatch "^\.">
    Order allow,deny
    Deny from all
</FilesMatch>
</IfModule>

# zip 包仅 install.zip 受红线保护需存在，但不应可下载；主题/插件包经后台通道分发不依赖直链
<IfModule mod_authz_core.c>
<FilesMatch "(?i)\.zip$">
    Require all denied
</FilesMatch>
</IfModule>

# ---------- install.php：自身已有 install.lock 双重拦截 ----------
# 上线完成后可取消下行注释彻底关闭安装入口
# <Files "install.php"><IfModule mod_authz_core.c>Require all denied</IfModule></Files>
