如何将Ghost博客接入Google App Engine现有Flask应用并通过子目录访问?
实现Ghost博客通过GAE Flask应用子目录访问的可行方案
你的需求完全可行,但因为ghost.org是独立托管的外部服务,没法直接通过App Engine的app.yaml直接路由——app.yaml主要用来配置GAE内部服务的路由,没法直接指向外部域名。下面给你几个适配不同偏好的解决方案:
方案1:在Flask应用中实现反向代理(适合不想换托管方式的情况)
你可以在Flask里加一个代理路由,把所有/blog开头的请求转发到你ghost.org托管的博客地址。这种方式不需要改动GAE的基础配置,只需要在Flask代码里加逻辑:
from flask import Flask, request, Response import requests from flask_cors import CORS # 需要安装flask-cors处理跨域 app = Flask(__name__) CORS(app) # 解决ghost博客资源的跨域问题 # 替换成你在ghost.org的博客地址 GHOST_BLOG_URL = "https://your-custom-ghost-blog.ghost.io" @app.route('/blog/<path:path>') @app.route('/blog') def proxy_ghost_blog(path=''): # 拼接目标URL target_url = f"{GHOST_BLOG_URL}/{path}" if path else GHOST_BLOG_URL # 转发请求到ghost博客 response = requests.request( method=request.method, url=target_url, headers={k: v for k, v in request.headers.items() if k != 'Host'}, data=request.get_data(), cookies=request.cookies, allow_redirects=False ) # 过滤掉会导致冲突的响应头 excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection'] response_headers = [(k, v) for k, v in response.raw.headers.items() if k.lower() not in excluded_headers] return Response(response.content, response.status_code, response_headers) # 你的原有Flask路由 @app.route('/') def home(): return "Hello from Flask App!"
⚠️ 注意事项:
- 要先安装依赖:
pip install flask requests flask-cors - 部分ghost.org托管的博客可能会限制反向代理请求,你需要确认ghost.org的服务条款允许这种方式
- GAE标准环境有请求超时限制(默认60秒),要确保代理请求能在超时前完成
方案2:用CDN做路径转发(更稳定的无代码方案)
如果不想改动Flask代码,推荐用Cloudflare这类CDN服务做路径转发:
- 把你的域名DNS解析到CDN服务
- 在CDN后台创建路径规则,设置当访问路径匹配
*/blog/*时,转发到你的ghost.org博客地址 - 同时配置URL重写,把响应里的ghost.org域名替换成你的主域名(比如把
https://your-ghost-blog.ghost.io/assets/xxx改成https://www.example.com/blog/assets/xxx),避免资源跳转到外部域名
这种方式的优势是不用碰应用代码,CDN会处理所有转发和URL修正,稳定性更高。
方案3:将Ghost部署到GAE(放弃ghost.org托管,更原生的集成)
如果你愿意自己托管Ghost,可以把它作为GAE的第二个服务部署,配合dispatch.yaml实现子目录路由:
- 把Flask应用作为GAE的
default服务部署 - 把Ghost博客(Node.js应用)打包成另一个服务(比如命名为
ghost)部署到GAE - 在项目根目录创建
dispatch.yaml文件,配置路由规则:
dispatch: - url: "*/blog/*" service: ghost - url: "*/blog" service: ghost - url: "*/*" service: default
- 修改Ghost的配置文件,把
url字段设置为https://www.example.com/blog,确保博客内部的链接、资源路径都正确指向子目录
这种方式是最原生的GAE集成方案,没有跨域或代理的潜在问题,但需要自己维护Ghost的部署和更新。
内容的提问来源于stack exchange,提问作者howMuchCheeseIsTooMuchCheese
相关产品推荐
相关产品推荐

