# 家书 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"的地方。 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] # ⚠️⚠️ 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 —— # 典型的"本地好好的、线上不行"。部署脚本也会把这一段追加到线上那份里。) CGIPassAuth On # 备份/临时文件永远不给出去(这条线上很要紧:*.php.bak 曾经可被直接下载) Require all denied Require all denied