# FeedLite —— 安全与整洁（Apache 规则）
#
# 作用：禁用目录列表；阻止对数据库 / 配置文件 / 备份文件 / 文档的直接下载。
# ⚠️ 这些规则只拦「静态直读」。.php 文件本身仍是「被 PHP 执行」而非下载，
#    所以拦截的重点是「非 .php 后缀但内容敏感」的文件 —— 例如手工或工具产生的
#    config.php.bak_20260928_193339（名字以数字结尾！旧写法的 \.bak$ 匹配不到它，
#    于是它被当作静态文件原样吐出，等于公开了管理员口令与接口令牌）。
#    因此后缀匹配一律放宽为「后缀出现在文件名任意位置」，而不是只匹配结尾。

Options -Indexes

# —— 数据库 / 日志 / 文档 / 配置与备份（含任意后缀形式）——
# 关键点：不写 $ 结尾锚点，避免 config.php.bak_20260928_193339 这类名字漏网。
<FilesMatch "(?i)\.(db|sqlite|sqlite3|log|md|ini|bak|old|orig|save|swp|swo|tmp|temp|copy|dist|example\.php\.|php\.(bak|old|orig|save|txt|swp|tmp))">
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
</FilesMatch>

# —— 兜底：任何「含 .php 且后面还跟着别的东西」的文件一律拒绝 ——
#    正常 PHP 入口都是 xxx.php 结尾，会被 PHP 执行；
#    而 config.php.bak_20260928、config.php.txt、admin.php.old 这类
#    不会被执行、只会被当文本下载 —— 全部拒掉。
<FilesMatch "(?i)\.php[.\-_]">
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
</FilesMatch>

# —— 隐藏文件（.env / .git 之类）——
<FilesMatch "^\.">
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
</FilesMatch>

# —— 点名拒绝：只含真实凭据的配置文件（正常请求永远不会直接访问它们）——
# 它们通常会被 PHP 执行（返回空 body）而不泄漏，但显式拒绝可以防「PHP 处理器被改
# 成静态输出」「服务器换了不支持的执行配置」这类意外，属于纵深防御。
# 注意：文件系统层面的 require 不受影响，程序读配置照常工作。
<FilesMatch "(?i)^(config|config\.local|oss\.sts)\.php$">
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
</FilesMatch>