# acg-faka 伪静态规则（Apache 2.2+）
# 与 nginx、IIS 两份规则共用同一套语义，任何一边改了另外两边要跟着改。

<IfModule mod_setenvif.c>
 # 让 Authorization: Bearer 头透传到 PHP（部分 Apache/FastCGI 会吞掉它）。
 # MCP 端点同时支持 X-Access-Key 头，无需依赖此项。
 SetEnvIf Authorization "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteBase /

 # ── 拒绝规则（必须排在伪静态之前）──────────────────────────────
 # 统一返回 404 而不是 403：403 等于告诉对方「这个文件确实存在」。
 #
 # ★ 所有模式都基于 per-dir 路径（不含开头斜杠），且目录模式用 ^ 锚在站点根，
 #   不能去掉：app/Plugin/Chat/View/Panel/assets/vendor/ 和
 #   assets/admin/controller/config/ 都是要正常访问的静态资源，
 #   一旦改成任意层级匹配就会被误杀。

 # ① 程序目录：运行时数据、内核源码、配置、Composer 依赖
 RewriteRule ^(runtime|kernel|config|vendor)(/|$) - [NC,R=404,L]

 # ② 点文件 / 点目录：.env、.git、.user.ini、.DS_Store …（放行 ACME 证书校验）
 RewriteRule (^|/)\.(?!well-known) - [NC,R=404,L]

 # ③ 敏感后缀：日志、数据库、备份、编辑器交换文件。
 #    app/Plugin/*/runtime.log 和 version/*/update.sql 全靠这条兜住。
 RewriteRule \.(log|sql|sqlite|db|db-wal|db-shm|bak|old|save|orig|swp|swo|tmp|ini|lock)$ - [NC,R=404,L]

 # ④ 备份副本与依赖清单：index.php~、composer.json、package-lock.json
 RewriteRule (~|composer\.(json|lock)|package(-lock)?\.json)$ - [NC,R=404,L]

 # ⑤ 只放行唯一入口 index.php，其余 .php 一律不执行 ——
 #    上传目录里就算真被塞进一个 .php，也跑不起来。
 #    ★ 判断依据只能用 per-dir 路径，不能用 %{REQUEST_URI}：伪静态命中后
 #    mod_rewrite 会带着 index.php 把规则重跑一遍，那时 REQUEST_URI 仍是
 #    原始地址（/user/order），用它会把整个前端控制器 404 掉。
 RewriteRule ^(?!index\.php(/|$)).*\.php(/|$) - [NC,R=404,L]

 # ⑥ 目录列表。Apache 很多环境默认开着 Indexes，会把 app/Plugin 这类目录整个列出来，
 #    nginx 侧 autoindex 默认是关的 —— 这里补齐，没有索引文件的目录直接 404。
 #    刻意不用 Options -Indexes：那条需要 AllowOverride Options，
 #    而不少虚拟主机只放开了 FileInfo，写上去会整站 500。
 RewriteCond %{REQUEST_FILENAME} -d
 RewriteCond %{REQUEST_FILENAME}/index.php !-f
 RewriteCond %{REQUEST_FILENAME}/index.html !-f
 RewriteRule ^ - [R=404,L]

 # ── 伪静态 ────────────────────────────────────────────────────
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
</IfModule>
