Ghost 开发环境多 URL 场景测试指南:设备访问、HTTPS 与子目录配置验证

发布时间:2026/9/8 23:03:33

Ghost 开发环境多 URL 场景测试指南:设备访问、HTTPS 与子目录配置验证
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),仅供参考

相关新闻

三步在Windows离线装好draw.io桌面版:无网络绘图新手指南

三步在Windows离线装好draw.io桌面版:无网络绘图新手指南

2026/9/8 23:03:33

三步在Windows离线装好draw.io桌面版:无网络绘图新手指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 把架构图交给客户前,你还得先把图表上传到别人…

tiny11builder:为旧电脑构建轻量 Windows 11 系统镜像的完整方法

tiny11builder:为旧电脑构建轻量 Windows 11 系统镜像的完整方法

2026/9/8 22:53:33

tiny11builder:为旧电脑构建轻量 Windows 11 系统镜像的完整方法 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder tiny11builder 是一套开源 PowerShel…

办澳签用的银行流水NAATI认证翻译全攻略,避开90%的退件坑

办澳签用的银行流水NAATI认证翻译全攻略,避开90%的退件坑

2026/9/8 22:53:33

准备澳洲签证的申请人大多遇到过这样的糟心事:明明资金证明充足,却因为银行流水翻译件不合规被移民局退回补件,白白耽误申请进度,甚至影响出签结果。其实只要搞懂NAATI认证翻译的核心要求,选对办理渠道,银行…

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

2026/9/8 23:53:36

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/…

电梯非侵入式改造的三大物理红线:供电、信号、通信隔离

电梯非侵入式改造的三大物理红线:供电、信号、通信隔离

2026/9/8 23:53:36

1. 为什么“非侵入式”不是一句空话,而是维保红线的物理分界线 在电梯行业干了十多年,我经手过上百台不同品牌、不同年代的电梯加装智能调度系统。最常听到的一句话是:“师傅,你们这个盒子接一下控制柜就行,不改线路&a…

5 分钟跑通 Devika:让开源 AI 工程师替你写代码

5 分钟跑通 Devika:让开源 AI 工程师替你写代码

2026/9/8 23:53:36

5 分钟跑通 Devika:让开源 AI 工程师替你写代码 【免费下载链接】devika Devika is the first open-source implementation of an Agentic Software Engineer. Initially started as an open-source alternative to Devin. 项目地址: https://gitcode.com/GitHub_…

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南

2026/9/8 23:53:36

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

基于STM32的可穿戴手环设计:从硬件选型到固件调试

基于STM32的可穿戴手环设计:从硬件选型到固件调试

2026/9/8 23:53:36

简介:一套基于STM32的可穿戴手环完整设计工程,面向嵌入式爱好者、单片机学习者及智能穿戴开发者,涵盖主控选型、UCOS实时操作系统移植、多种传感器集成与单片机编程实现,可帮助读者从零搭建具备环境监测、心率检测和运动姿态识别功…

Slidev 项目目录结构完全指南:以约定驱动组件、布局、样式与全局图层的扩展机制

Slidev 项目目录结构完全指南:以约定驱动组件、布局、样式与全局图层的扩展机制

2026/9/8 23:43:35

Slidev 项目目录结构完全指南:以约定驱动组件、布局、样式与全局图层的扩展机制 【免费下载链接】slidev Presentation Slides for Developers 项目地址: https://gitcode.com/GitHub_Trending/sl/slidev Slidev(Presentation Slides for Develop…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…