Cloudflare Tunnel 路径转发踩坑与三种解决方案(免费vs收费)

发布时间:2026/6/16 18:00:03
Cloudflare Tunnel 路径转发踩坑与三种解决方案(免费vs收费) 先说一下我踩坑的问题CF Tunnel 的 ingress 规则里path匹配会把完整路径透传给后端。配置长这样ingress:-hostname:mydomain.compath:/appPathservice:http://localhost:8080访问https://mydomain.com/appPath时后端 Flask 收到的路径是/appPath不是/。但 Flask 路由只写了app.route(/)直接 404。这个问题不是个例。我的每个项目路径不一样不可能为了适配 CF 去改代码。这就很头铁我就必须找一个一劳永逸的方法然鹅好像没有方案1子域名代替路径免费核心思路不同服务分配不同子域名不共用主域名路径。改造前访问地址目标端口https://mydomain.com/myPath应用8080https://mydomain.com/主站5080改造后访问地址目标端口https://myPath.mydomain.com/应用8080https://mydomain.com/主站5080后端收到的路径就是/不用改任何代码。要注意这不是myPath前后换了换位置而是数据流传递路由的问题。操作步骤1. Cloudflare DNS 加子域名记录Dashboard → 域名 → DNS → Records → Add Record字段值TypeCNAMENamemyPathTargetmydomain.comProxy开启TTLAuto2. 改 cloudflared 配置ingress:-hostname:myPath.mydomain.comservice:http://localhost:8080-hostname:mydomain.comservice:http://localhost:5080-service:http_status:4043. 重启 cloudflared# 先噶掉已有的服务关闭隧道taskkill/F/IM cloudflared.exe# 重新启动服务或命令行运行打开隧道cloudflared tunnel--config config.yml run my-domain-bot4. 验证http://localhost:8080→ 正常https://myPath.mydomain.com/→ 正常https://mydomain.com/→ 正常为什么有效DNS 层子域名 CNAME 指向主域名CF 自动处理 SSLTunnel 层hostname匹配子域名请求完整转发后端层路径就是/Flask 路由直接命中对比其他方式方案问题路径匹配path: /myPath路径不剥离后端收到/myPathOrigin Rules 改写Free 计划不支持子域名✅ 免费不改代码配置一次管用注意DNS 记录 1-2 分钟生效旧链接mydomain.com/myPath需要更新为myPath.mydomain.com子域名数量没有限制后续加api.xxx、admin.xxx继续加 CNAME 就行方案2本地 Nginx 反向代理免费需维护思路在本地起一个 Nginx让 cloudflared 只指向 Nginx由 Nginx 负责路径剥离和转发。适合已经在用 Nginx 的场景多一层代理但逻辑清晰。Nginx 配置server { listen 8080; # 应用服务剥离 /myPath 前缀 location /myPath/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 主站直接透传 location / { proxy_pass http://localhost:5080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }cloudflared 配置不再用 path 匹配全部指向 Nginxingress:-hostname:mydomain.comservice:http://localhost:8080-service:http_status:404请求流向用户 → https://mydomain.com/myPath/foo ↓ cloudflared → http://localhost:8080/myPath/foo ↓ Nginx 剥离 /myPath → http://localhost:8080/foo ↓ Flask 收到 /foo → 正常匹配优缺点优点缺点完全免费需要维护 Nginx路径规则灵活想怎么改怎么改本地多一个服务要保活不依赖 CF 付费功能Nginx 挂了全部不通方案3cloudflared 自定义转发规则免费支持正则这个容易和 Origin Rules 搞混分开说。3a. Origin Rules面板功能付费Cloudflare 面板里的 Origin Rules 可以重写路径但仅 Pro 及以上计划可用Free 用户用不了。操作Dashboard → Rules → Origin Rules → Create rule字段值WhenHostname equalsmydomain.comANDURI Path starts with/myPathThenRewrite URI → Path → Static →/缺点只能静态替换/myPath/foo会变成/foo但如果路径里有动态部分处理不了。3b. cloudflared 自定义转发规则免费推荐cloudflared 本身支持Custom Forwarding Rules可以用正则表达式动态剥离路径前缀。Free 计划可用不需要付费。在config.yml里加custom_forwarding_rules:-hostname:mydomain.comforward:-path:^/myPath(/.*)?$destination:http://localhost:8080rewrite:/$1或者更简洁的写法直接在 ingress 里用path配合 rewritecloudflared 2024 版本支持ingress:-hostname:mydomain.compath:/myPathservice:http://localhost:8080originRequest:transform:-method:regex_replacepattern:^/myPath(/?.*)$replacement:$1请求流向用户 → https://mydomain.com/myPath/foo ↓ cloudflared 正则匹配剥离 /myPath ↓ 后端收到 /foo → Flask 正常匹配优缺点优点缺点免费不需要付费 Plan需要编辑配置文件正则写错会全挂正则替换动态路径也能处理cloudflared 版本要够新2024不用改后端代码调试不如面板直观我选的方案1子域名方案最省事免费、不改代码、不用维护额外服务、不依赖付费功能。唯一的代价是要改一下访问链接但长远来看最干净。