Caddy 配置问题

example.com {
  import log example.com
  import common

    handle /api/v2/* {
        reverse_proxy http://127.0.0.1:10000
    }
  handle_path /api/* {
    reverse_proxy http://127.0.0.1:8080 {
        @errors status 404
      handle_response @errors {
        reverse_proxy http://127.0.0.1:10000 {
            rewrite /api{uri}
        }
      }
    }
  }
  handle /builder/* {
      reverse_proxy http://127.0.0.1:10000
  }
  handle {
    reverse_proxy http://127.0.0.1:10000 {
      rewrite /prefix{uri}
    }
  }
}

如果去掉下面这段配置,/app/v2/* 路径的请求就会报 502 错误,不知道是为什么,有大佬懂吗

handle /api/v2/* {
        reverse_proxy http://127.0.0.1:10000
    }

虽然现在网站正常了,但是不知道原因好难受 :tired_face:

8080 端口服务被请求未定义的路由一定返回 404


开 debug 模式看了一下错误信息

{
    "level": "debug",
    "ts": 1727663872.4190404,
    "logger": "http.handlers.reverse_proxy",
    "msg": "upstream roundtrip",
    "upstream": "127.0.0.1:10000",
    "duration": 0.000241584,
    "request": {
        "proto": "HTTP/2.0",
        "method": "POST",
        "host": "example.com",
        "uri": "/api/v2/queries/query_datasource_d417999c7d824bb1bb53ba44c212df71_b8485022734c4405bcd476f6d67435a0",
        "headers": {
            "Sec-Ch-Ua": [
                "\"Microsoft Edge\";v=\"129\", \"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"129\""
            ],
            "X-Forwarded-Proto": [
                "https"
            ],
            "Sec-Fetch-Mode": [
                "cors"
            ],
            "Sec-Fetch-Site": [
                "same-origin"
            ],
            "Accept-Encoding": [
                "gzip, br"
            ],
            "X-Budibase-Api-Version": [
                "1"
            ],
            "Priority": [
                "u=1, i"
            ],
            "Content-Length": [
                "17"
            ],
            "Accept": [
                "application/json"
            ],
            "Sec-Ch-Ua-Mobile": [
                "?0"
            ],
            "X-Forwarded-Host": [
                "example.com"
            ],
            "Cf-Ray": [
                "8cb0d56288647c73-LAX"
            ],
            "User-Agent": [
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
            ],
            "Cookie": [
                "REDACTED"
            ],
            "Sec-Fetch-Dest": [
                "empty"
            ],
            "Cdn-Loop": [
                "cloudflare; loops=1"
            ],
            "X-Budibase-App-Id": [
                "app_79a24f5a85c94e6c94c81448370a144a"
            ],
            "Origin": [
                "https://example.com"
            ],
            "X-Budibase-Session-Id": [
                "cf88312de49d446878b0f2f88f2664485"
            ],
            "X-Budibase-Type": [
                "client"
            ],
            "Sec-Ch-Ua-Platform": [
                "\"Windows\""
            ],
            "Content-Type": [
                "application/json"
            ]
        },
        "tls": {
            "resumed": false,
            "version": 772,
            "cipher_suite": 4865,
            "proto": "h2",
            "server_name": "example.com"
        }
    },
    "error": "net/http: HTTP/1.x transport connection broken: http: ContentLength=17 with Body length 0"
}

我在 Caddy 论坛发帖询问了 Issues with Reverse Proxy Configuration in Caddy Server - #6 by francislavoie - Help - Caddy Community
开发团队回复了一些内容

2 个赞

你具体想问什么问题呢?在你的配置里10000端口很重要,为什么要删掉:question:

你的域名example.com默认打开就是10000端口。这算是默认首页了。比你8080端口重要多了。

如果这是一个梯子配置,那10000端口算是在掩护8080端口。你可以删掉10000端口,但是你要给配置一个默认首页的www/html的页面

2 个赞

caddy没玩过,需要重新学习

我是想知道为什么去掉 /api/v2/* 的 handle 后不能正确处理请求了,按理说 /api/* 的 handle_path 就可以正确处理

因为有其它程序接管了/api/v2的请求,所以你caddy的/api/*不会走caddy配置里的/apt/*的路线。

没有其他程序会接管请求,所有请求都是 caddy 负责转发。
我在 caddy 论坛发帖询问了,开发团队的意思大概是尝试对 8080 端口的请求后请求体的 body 被消耗了,没有继续传给 10000 端口的服务所以导致了错误。