# 家书 FamilyBook · Apache 重写规则
#
# ⚠️ 这个文件**不随包上线**（familybook_push.sh 的打包白名单里没有它）。
#    原因：线上站点根那份 .htaccess 是**宝塔面板生成的**（PHP 版本段、防盗链、
#    缓存段、伪静态…），整份覆盖会把面板的东西清空，而且面板下次重写还会改回来，
#    变成"时好时坏"。
#    /dav/ 与 /carddav/ 的重写规则由 `familybook_deploy.sh` 第 5c 段**追加**到线上那份里
#    （带 `# >>> FamilyBook CalDAV` 标记，幂等）。
#
#    那这份文件是干什么用的？
#      · 新建站点（没有宝塔那层）时，可直接把它作为站点根的 .htaccess；
#      · 它是那段规则的**唯一书面来源**，push 脚本会断言部署脚本里的规则串
#        与它完全一致（防两处漂移）。
#
# 只做一件事：把 /dav/ 与 /carddav/ 开头的 URL 分别交给 dav.php / carddav.php。
# 其余一律不动 —— index.php 那套 ?r=xxx 路由不依赖重写，
# 少写规则就少一处"上线才发现 404"的地方。

<IfModule mod_rewrite.c>
  RewriteEngine On

  # CalDAV：/dav/、/dav/3.ics/、/dav/3.ics/12.ics 全部交给 dav.php
  RewriteRule ^dav(/.*)?$ dav.php [L,QSA]

  # CardDAV（v24 第 22 批）：/carddav/、/carddav/1.vcf/、/carddav/1.vcf/12.vcf 交给 carddav.php
  # ⚠️ 两条规则**顺序无关但都必须有**：它们的前缀（dav vs carddav）互不包含，
  #    不会互相抢；写成 `^dav` 在前是因为历史顺序，真要调也不能写成 `^dav(/|$)` 之外的
  #    宽松形式 —— 那会把 /dav2/ 之类也吞进来。
  RewriteRule ^carddav(/.*)?$ carddav.php [L,QSA]
</IfModule>

# ⚠️⚠️ DAV 的 Basic 鉴权**必须**靠这一行才能在 Apache 上工作：
#    Apache 默认**不把 `Authorization` 头交给 PHP-FPM** → `$_SERVER['PHP_AUTH_USER']`
#    和 `HTTP_AUTHORIZATION` 都是 null → /dav/ 与 /carddav/ 无论口令填得多正确都 401。
#    线上实测（Apache 2.4.53，直接监听 80/443）：
#      没有这行 : {"PHP_AUTH_USER":null,"HTTP_AUTHORIZATION":null}
#      加上这行 : {"PHP_AUTH_USER":"abc","HTTP_AUTHORIZATION":"(有)"}
#    `CGIPassAuth` 是 Apache **2.4.13+ 的核心指令**，不需要额外模块。
#    （本地 `php -S` 会自己填好 PHP_AUTH_USER，所以 e2e 全绿而线上全 401 ——
#      典型的"本地好好的、线上不行"。部署脚本也会把这一段追加到线上那份里。）
<IfModule mod_authz_core.c>
  CGIPassAuth On
</IfModule>

# 备份/临时文件永远不给出去（这条线上很要紧：*.php.bak 曾经可被直接下载）
<FilesMatch "\.(bak|old|orig|save|swp|swo|tmp)$">
  Require all denied
</FilesMatch>
<FilesMatch "^\.|~$">
  Require all denied
</FilesMatch>
