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

基于Flask的博客平台如何实现自定义域名DNS绑定?

Flask实现博客自定义域名绑定方案

完全可以在Flask中实现自定义域名绑定功能,核心是通过DNS CNAME解析 + 请求Host头识别来实现,以下是具体的实现方案:

一、核心流程梳理

和你提到的bearblog.dev、Tumblr这类平台逻辑一致:

  1. 为每个博客生成唯一的代理标识域名(比如user-123.your-blog.com)
  2. 用户在自己的DNS服务商处完成两步配置:
    • 把自定义域名(如my-personal-blog.com)通过CNAME记录指向代理标识域名
    • 添加TXT记录完成域名所有权验证,防止恶意绑定
  3. 你的Flask服务通过识别请求的Host头,将流量路由到对应博客

二、Flask后端实现

1. 数据库存储设计

需要在数据库中新增绑定记录,字段示例:

  • user_id:关联的博客用户ID
  • custom_domain:用户的自定义域名(如my-personal-blog.com)
  • proxy_domain:平台生成的代理标识域名(如user-123.your-blog.com)
  • verified:域名验证状态(布尔值,验证通过后才生效)

2. 全局域名解析钩子

使用Flask的before_request钩子,在每个请求到达时解析Host头,匹配对应博客:

from flask import Flask, request, abort, g
from your_models import Blog  # 替换为你的ORM模型

app = Flask(__name__)

def get_blog_from_domain(domain):
    # 优先匹配自定义域名,再匹配代理域名
    return Blog.query.filter(
        (Blog.custom_domain == domain) | (Blog.proxy_domain == domain),
        Blog.verified == True
    ).first()

@app.before_request
def resolve_custom_domain():
    # 去掉端口号,只保留域名部分
    raw_host = request.host.split(':')[0]
    g.current_blog = get_blog_from_domain(raw_host)
    
    if not g.current_blog:
        abort(404)  # 未绑定的域名返回404,或跳转到绑定引导页

# 示例路由:根据当前域名返回对应博客内容
@app.route('/')
def blog_index():
    return f"Welcome to {g.current_blog.title}!"

3. 域名验证逻辑

使用DNS解析库验证用户的TXT记录,确保域名归属:

import dns.resolver

def verify_domain_ownership(user_id, custom_domain):
    # 生成验证用的TXT值
    expected_txt = f"your-blog-verification={user_id}"
    try:
        # 查询验证用的TXT记录
        answers = dns.resolver.resolve(f"_domainverify.{custom_domain}", 'TXT')
        for rdata in answers:
            if rdata.to_text().strip('"') == expected_txt:
                return True
    except (dns.resolver.NXDOMAIN, dns.exception.Timeout):
        pass
    return False

三、生产环境配置(关键)

Flask自带的开发服务器无法直接处理多域名请求,必须配合反向代理(如Nginx):

Nginx配置示例

server {
    listen 80;
    listen 443 ssl;
    server_name _;  # 匹配所有域名

    # 配置SSL证书(推荐用Let's Encrypt通配符证书)
    ssl_certificate /etc/letsencrypt/live/your-blog.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-blog.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;  # 指向Flask的Gunicorn服务
        proxy_set_header Host $host;  # 必须传递原始请求的Host头给Flask
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • server_name _:匹配所有访问的域名,确保自定义域名的请求能被Nginx接收
  • proxy_set_header Host $host:这是核心,让Flask能拿到用户的自定义域名

四、SSL证书处理

所有自定义域名必须支持HTTPS,推荐两种方案:

  1. 通配符证书:申请*.your-blog.com的通配符证书,覆盖所有代理域名;同时为用户的自定义域名单独申请证书(可通过Certbot自动脚本实现)
  2. ACME自动申请:用certbot或acme.sh配合Nginx,自动为新绑定的自定义域名申请Let's Encrypt证书

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:50