You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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实现子目录路由:

  1. 把Flask应用作为GAE的default服务部署
  2. 把Ghost博客(Node.js应用)打包成另一个服务(比如命名为ghost)部署到GAE
  3. 在项目根目录创建dispatch.yaml文件,配置路由规则:
dispatch:
  - url: "*/blog/*"
    service: ghost
  - url: "*/blog"
    service: ghost
  - url: "*/*"
    service: default
  1. 修改Ghost的配置文件,把url字段设置为https://www.example.com/blog,确保博客内部的链接、资源路径都正确指向子目录

这种方式是最原生的GAE集成方案,没有跨域或代理的潜在问题,但需要自己维护Ghost的部署和更新。


内容的提问来源于stack exchange,提问作者howMuchCheeseIsTooMuchCheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:14:09