
Ghost 开发环境多 URL 场景测试指南设备访问、HTTPS 与子目录配置验证【免费下载链接】GhostIndependent technology for modern publishing, memberships, subscriptions and newsletters.项目地址: https://gitcode.com/GitHub_Trending/gh/Ghost本篇指南聚焦 Ghost 开源发布平台的开发环境 URL 测试方法论。Ghost 的常规开发环境固定运行在http://localhost:2368但真实业务往往涉及局域网设备访问、HTTPS 站点、站点部署于子目录以及 Admin 与站点分离在不同域名等复杂形态。读完本文你将掌握如何借助 HTTPS 隧道在手机/平板/另一台电脑上临时验证站点与 Admin、如何用 Caddy .localhost域名在本地完整复现「HTTPS 子目录 独立 Admin URL」三合一配置以及如何为 URL 相关行为补充自动化测试覆盖。一、先理解 Ghost 的 URL 配置体系Ghost Core 的 URL 由两部分核心配置驱动url站点对外公开的完整基础地址既决定路由解析也决定站点内部生成的绝对链接admin.urlAdmin 后台的独立地址可选。一旦配置/ghost/相关请求会按该地址重定向与路由。开发期这些值可以通过运行时配置覆盖其中首选载体是ghost/core/config.local.json——它是 Ghost 开发环境约定俗成的本地配置覆盖文件会被 Git 忽略适合存放仅限本机/本次测试的临时 URL 覆盖。与之相对的默认开发配置 ghost/core/config.development.json 内容极为精简仅开启enableDeveloperExperiments常规启动参数并不在配置文件中写死 URL而是由环境与启动脚本决定默认的http://localhost:2368。测试的基本原则是针对你的改动所影响的 URL 形态去测试而不是为了覆盖每一种 URL 边界情况反复重建整个开发环境。下文所有方案都建立在已有的pnpm dev/ Docker 开发环境之上做增量验证。二、在另一台设备上测试HTTPS 隧道方案当需要在手机、平板或另一台电脑上打开站点或 Admin 时最省事的方式是打一条 HTTPS 隧道。这能避免每台测试设备都要维护本地 DNS、分配静态 IP、安装本地证书颁发机构CA的麻烦。操作步骤保持pnpm dev正常运行安装并认证 ngrok 的 ngrok agentGhost 开发团队也确认 Caddy 网关信任 Tailscale Funnel 等同类隧道代理转发的协议头针对开发网关所在端口打隧道ngrok http 2368在另一台设备上打开 ngrok 给出的 HTTPS 转发地址站点即可访问Admin 在同一 URL 的/ghost/路径下。两个关键经验隧道要打在网关2368不要打在单个子服务上。Ghost 前端public app与 Admin 各有独立的 Vite/开发服务器如果只给某一个开发服务器打隧道请求就绕过了开发环境既有的路由与中间件链条。把隧道开在统一入口的 Caddy 开发网关上请求才会继续走与平时开发环境完全一致的路径转发协议头也能被正确信任。隧道 URL 通常是临时的链接仍指向本机。隧道只解决了“打开页面”的入口问题Ghost 内部根据配置的url生成的绝对链接分享卡片、邮件链接、规范链接等仍会是http://localhost:2368。如果被测行为依赖绝对链接就需要把转发域名写进配置并重启开发环境创建ghost/core/config.local.json{ url: https://your-forwarding-domain.example }重启开发环境使配置生效测试结束后删除该文件——它被 Git 忽略切勿提交。同时请把公共隧道 URL 视为一次临时的公网暴露不要在本地使用生产数据或生产凭据测完立即关闭隧道。三、完整复现「HTTPS 子目录 独立 Admin URL」本地 Caddy 环境当改动影响重定向、生成的链接、API 请求、Cookie 或静态资源而这些行为又依赖 HTTPS 协议、子目录路径或 Admin 独立域名时单靠隧道就不够了。仓库提供了一个专用的手动环境来在浏览器里逐项检查这三种行为。方案原理在 Ghost Core 前面跑一个本地 TLS 代理Caddy提供真正的 HTTPS 请求使用.localhost主机名——如site.localhost、admin.localhost——它们无需修改/etc/hosts、也无需运行 DNS 服务器就会自动解析到回环地址loopback证书则由 Caddy 的本地 CA 自动签发并可信用覆盖文件同时配置站点 URL 的 HTTPS 协议、/blog/子目录与 Admin 独立主机名一次覆盖全部三种边界。第一步准备本地配置覆盖安装 Caddy若尚未安装然后创建ghost/core/config.local.json{ url: https://site.localhost:8443/blog/, admin: { url: https://admin.localhost:8443/blog/ } }注意两点语义站点 URL 中的/blog/提供子目录路径。站点页面会挂在/blog/下根路径/将不再返回站点内容独立 Admin URL 使用了同一个子目录——因为 Ghost 的 Admin 与 API 路由始终位于所配置的站点路径之下二者不能各用各的子目录否则路由会错位。第二步用 URL-testing Compose 覆盖启动 Docker 服务从仓库根目录执行DEV_COMPOSE_FILES-f docker/dev-url-testing/compose.yaml \ pnpm nx run ghost-monorepo:docker:up这条命令相当于在默认docker compose -f compose.dev.yaml ... up之上叠加了 docker/dev-url-testing/compose.yaml。该覆盖文件的核心只有一处端口映射services: ghost-dev: ports: - 2369:2368即把 Ghost Core 额外暴露在本机2369端口。这是故意为之额外启动的 Caddy 进程必须直连 Ghost Core而不是走默认 2368 的开发网关Express 才能信任 Caddy 转发的 HTTPS 请求头。如果让请求继续经过默认网关转发协议信息会在中间层丢失或不被信任HTTPS 场景就无法真正模拟。从源码看根目录 package.json 中的 npm 脚本docker:down与 Nx 目标docker:up/docker:down均通过${DEV_COMPOSE_FILES}环境变量透传额外 Compose 文件这正是DEV_COMPOSE_FILES前缀能被统一识别的原因docker:up还会自动dependsOn构建并执行up -d --force-recreate --wait保证服务就绪后才返回。第三步启动本地 TLS 代理另开一个终端运行caddy run --adapter caddyfile \ --config docker/dev-url-testing/Caddyfile首次运行 Caddy 可能要求输入系统密码——它需要把本地 CAlocal_certs安装进系统信任链才能为.localhost站点签发并信任证书。仓库中的 docker/dev-url-testing/Caddyfile 内容如下{ local_certs http_port 9080 } https://site.localhost:8443 { reverse_proxy http://localhost:2369 { header_up Host site.localhost:8443 } } https://admin.localhost:8443 { reverse_proxy http://localhost:2369 { header_up Host admin.localhost:8443 } }值得逐行解读local_certs启用本地 CA 自动签发证书http_port 9080把明文 HTTP 端口改到 9080避免与环境中其它 80 端口服务冲突两个站点块分别以各自的主机名反代到localhost:2369即上一步直连的 Ghost Core并且通过header_up Host重写 Host 头——这是关键所在Ghost 依赖 Host 头区分当前请求归属site.localhost还是admin.localhost从而决定子目录页面与 Admin 路由如何响应也便于 Express 侧基于该信息处理重定向。第四步在浏览器中验证Caddy 就绪后打开站点https://site.localhost:8443/blog/Adminhttps://admin.localhost:8443/blog/ghost/重点检查受改动影响的重定向行为、生成的链接、API 请求、Cookie 与静态资源。一个典型的自检用例请求站点主机名的/blog/ghost/路径应当被 301 重定向到 Admin 主机名即https://admin.localhost:8443/blog/ghost/。若请求落回站点主机或没有发生重定向说明独立 Admin URL 配置或 Host 路由未生效。适用范围与局限此配置提供的是从 Ghost Core 直接吐出的 Admin 静态资产它不会走常规 Admin 的 Vite/HMR 开发链路——那个开发服务器的启动探针假定使用默认根 URL无法在自定义子目录/端口下自举。因此推荐的工作方式是日常高频小步迭代用下一节的自动化测试兜底浏览器端最终验证再启这套手动环境。清理按CtrlC停止 Caddy然后带着同一个 Compose 覆盖停掉 Docker 服务DEV_COMPOSE_FILES-f docker/dev-url-testing/compose.yaml pnpm docker:down最后务必删除ghost/core/config.local.json——只要它存在Ghost 就会继续使用备选 URL导致回到pnpm dev时站点无法按默认地址访问。该文件虽被 Git 忽略仍需手动清理。四、把 URL 配置行为固化为自动化测试手工环境适合浏览器最终验证而日常回归与聚焦开发则应交由 HTTP 层的自动化测试。Ghost Core 将高级 URL 配置测试集中在 ghost/core/test/e2e-frontend/advanced-url-config.test.js适合承载依赖以下三种形态的覆盖HTTPS 站点 URL站点安装在子目录下Admin 与站点使用不同的 origin主机/端口。在ghost/core目录下运行该文件pnpm test:single test/e2e-frontend/advanced-url-config.test.js从该测试文件源码可以读出既有覆盖的形态与断言方式也便于理解“什么用例应该放这里”子目录路由url http://localhost/blog/断言根路径/返回 404/blog301 到/blog//blog/与/blog/welcome/返回 200/welcome/子目录之外返回 404/blog/tag/getting-started/200 而/tag/getting-started/404AMP 路径/blog/welcome/amp/301 而/welcome/amp/404草稿预览路由/blog/p/uuid/返回 200 且Cache-Control为禁止缓存的规则。子目录 独立 Admin origin 的重定向url http://localhost/blog/admin:url http://admin.localhost/断言/blog/ghost、/blog/ghost/均 301 到http://admin.localhost/blog/ghost/Admin API 请求/blog/ghost/api/admin/posts/、/blog/ghost/api/admin/site/也会 301 到 Admin origin 下同路径——证实了“Admin 与 API 路由始终在站点子目录之下、再整体跳转到独立 Admin origin”的架构事实。测试通过config-utils的configUtils.set(url, ...)/configUtils.set(admin:url, ...)等共享测试配置助手在启动 Ghost 实例前注入配置并用urlUtils.stubUrlUtilsFromConfig()让 URL 工具从配置重建最后在afterAll里统一restore。补充自动化覆盖的准则当改动可通过 Ghost 的 HTTP 响应、重定向、生成 URL 或路由行为验证时优先在advanced-url-config.test.js中新增聚焦用例只有当更低层级的单测足以验证时才在ghost/core/test/其它测试文件中通过同样的共享配置助手设置url与admin:url。这样既能保持高级 URL 形态的 HTTP 层回归集中在一处又能避免不必要的 e2e 开销。五、方案选型速查需要验证的场景推荐方案核心配置/命令在另一台设备/浏览器打开站点与 Adminngrok 等 HTTPS 隧道打在网关ngrok http 2368必要时用 config.local.json 覆盖urlHTTPS /blog/子目录 独立 Admin URL 三合一浏览器验证Caddy .localhost Compose 覆盖config.local.json、docker/dev-url-testing/compose.yaml、Caddyfile子目录路由、独立 Admin origin 重定向的持续回归HTTP 层自动化测试advanced-url-config.test.jspnpm test:single运行无论选择哪条路径通用纪律始终一致临时配置一律放ghost/core/config.local.json绝不提交测试结束清掉覆盖文件并关闭隧道保持普通开发环境与 URL 测试环境彼此隔离按需启停。【免费下载链接】GhostIndependent technology for modern publishing, memberships, subscriptions and newsletters.项目地址: https://gitcode.com/GitHub_Trending/gh/Ghost创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考