面向办公室与 VPN 用户的单一 CiviCRM URL:设置步骤
保持一个规范 CiviCRM URL,并让 LAN 与 VPN 客户端各有通往它的路径。随后在上线前检查基础 URL、生成的链接和缓存。
办公室笔记本电脑应能在工位上、也能在家通过 VPN 打开同一个 CiviCRM 书签。经得起用户考验的设计是一个规范地址,比如 https://crm.example.org/,并配有一条从各位置获批的网络路径,以及一张对该名称有效的证书。VPN 改变的是远程客户端到达服务器的方式。它绝不应改变应用的身份,因为一旦改变,每个生成的链接、重定向和集成回调都会变成第二个要解决的问题。
先选 URL,再选路由
先把预期地址写下来,包括 CMS 需要的任何路径部分,并把它当作固定点。本手册中的其他内容都是实现细节,可以在不触碰它的情况下更改:每组收到哪个 DNS 答案、哪条防火墙规则允许监听器,以及 流量是经隧道还是经本地交换机端口到达。
在访问计划中一并记录四个值,因为它们只有作为一个集合才成立。规范 URL。每个客户端组应就该名称收到的答案。该答案对应的路由和访问规则。Web 服务器和证书配置为服务的那个主机名。日后一旦出问题,坏掉的元素就是这四者之一,你会知道改的是哪一个。
第 1 步:让该名称对两组都能正确解析
两组都应拿到一个他们真正能到达的私有答案,只要名称不变,答案不同是合理的。LAN 客户端通过内部解析器解析;VPN 客户端需要一条解析器策略,把同一区域交给他们,而不是让查询泄漏到公共解析器、拿到一个用不了的公共答案。
在每个上下文中实测该名称,而不是假设;并用 curl 的 resolve 选项把地址钉在单个请求上,独立于 DNS 测试路径:
dig +short crm.example.org
curl -sSI --resolve crm.example.org:443:10.10.5.20 https://crm.example.org/ | head -5
如果第一次测试返回客户端无法到达的地址,问题在隧道路由或 split-tunnel 列表。如果第二次测试返回重定向到你没有预期的主机名,停下来读 Location 头,因为那是应用问题,任何路由调整都修不好。
第 2 步:对齐 Web 服务器、证书与 CMS 基础 URL
监听器必须配置为服务该规范名称,证书必须覆盖它。用原始地址浏览不是变通办法:它会造成名称不匹配、可能破坏 cookie 作用域,还会教会用户一路点过警告——而这些警告你以后得向审计员解释。
在反向代理之后,确保应用知道请求是经 HTTPS 到达的。多数 CMS 平台会根据检测到的协议生成绝对链接,而一个终止 TLS 却不转发原始协议的代理,会产出一个满是 http:// 资源、浏览器可能拦截的页面。要显式配置可信代理和转发头,而不是让应用去猜。
然后对齐 CMS 与 CiviCRM 的基础 URL。CiviCRM 会保留其确定的基础 URL,并提供受支持的重算方式:管理员的“清理缓存并更新路径”操作,见 CiviCRM 安装故障排查指南。要在规范名称与 CMS 设置一致之后再运行它,而不是之前,否则你只是把一个即将改掉的值缓存起来。
cv flush
# then Administer > System Settings > Cleanup Caches and Update Paths
第 3 步:检查 CiviCRM 生成的地址
能打开首页说明不了什么。CiviCRM 运行在 CMS 之内,真正要紧的是那些自行构建 URL 的页面:登录重定向、管理菜单、扩展资源、已上传文件的链接,以及集成注册的任何外部回调。
加载仪表盘,打开一条联系人记录,查看页面源码中的绝对链接。如果它们指向只有某一客户端组能到达的主机名,那么即便页面渲染出来,基础 URL 仍然是错的。如果指向正确的名称却是错误的协议,要修的就是代理配置。
当地址确实必须变更时,把它当作应用迁移而非 DNS 编辑。核查资源 URL、缓存、已发布的链接,以及每一个存有旧地址的外部集成,然后在一个窗口期内全部更新,免得谁手里还留着迁移到一半的书签。
请求主机名不是信任决策
不要因为请求头里有某个字符串就选择一个特权基础 URL。PHP 文档记录了某些 Apache 配置,其中 server-name 值可能反映客户端提供的主机;而 server address 变量描述的是服务器,不是访问者的位置。这两者都不是访问控制机制,拿它们去搭一个,正是私有服务开始把错误内容发给错误主机的路径。
如果确实需要多个主机名,就在 Web 服务器、CMS 和应用层配置一份明确的允许列表,让请求主机名只能在已批准的条目中选择。任意输入永远不应成为绝对链接的来源,也不应成为可信的重定向目标。
在每个已批准的上下文中用同一个书签收尾:一次登录、一次普通站内导航,以及一次资源请求。要比较响应中的主机名,而不只是页面有没有加载。这个三请求检查能把路径问题与仍在生成错误地址的应用区分开,每组客户端大约一分钟。