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

如何将无TLS的HTTP/2流量转换为HTTP/1.1并转发?

实现无TLS HTTP/2(h2c)到HTTP/1.1转发的简便方案

刚好之前折腾过类似的需求,给你几个简单可行的方案,不用死磕HAProxy或者Apache的限制~

方案一:Nginx 快速配置(推荐,适合已有Nginx环境)

Nginx从1.13.9版本开始原生支持h2c(无TLS的HTTP/2),配置起来非常直接,不需要额外安装模块。

下面是完整的配置示例:

server {
    # 监听8080端口,不加ssl参数的http2会自动处理h2c请求
    listen 8080 http2;
    server_name localhost;

    location / {
        # 转发到你的目标后端(HTTP/1.1服务)
        proxy_pass http://your-target-backend:port;
        
        # 必要的头信息传递
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # 明确指定用HTTP/1.1转发给后端
        proxy_http_version 1.1;
        proxy_set_header Connection "";  # 清除Connection头,避免后端误解
    }
}

这个配置会自动处理两种h2c请求场景:

  • 客户端直接发送HTTP/2的Preface(就是那个PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n的开头)
  • 客户端先发送HTTP/1.1请求并带上Upgrade: h2c头升级协议

方案二:Caddy 2 零成本配置(推荐,快速搭建)

Caddy 2对h2c的支持更友好,几乎不需要额外配置就能搞定,适合快速搭建转发服务:

# 监听8080端口
:8080 {
    reverse_proxy http://your-target-backend:port {
        # 强制用HTTP/1.1转发到后端
        transport http {
            versions 1.1
        }
    }
}

Caddy默认会自动识别并处理无TLS端口上的h2c请求,转发逻辑完全封装好了,你只需要指定后端地址就行,省心到爆炸~

方案三:Envoy Proxy(适合复杂流量管控场景)

如果你的场景需要更灵活的流量控制(比如负载均衡、熔断、限流等),Envoy也是个不错的选择,核心配置片段如下:

listeners:
- name: h2c_listener
  address:
    socket_address: { address: 0.0.0.0, port_value: 8080 }
  filter_chains:
  - filters:
    - name: envoy.filters.network.http_connection_manager
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
        codec_type: AUTO  # 自动识别h2c或HTTP/1.x请求
        stat_prefix: ingress_http
        route_config:
          name: local_route
          virtual_hosts:
          - name: backend
            domains: ["*"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: target_backend }
        http_filters:
        - name: envoy.filters.http.router
          typed_config: {}

clusters:
- name: target_backend
  connect_timeout: 0.25s
  type: STRICT_DNS
  lb_policy: ROUND_ROBIN
  # 默认用HTTP/1.1转发,不需要额外配置
  load_assignment:
    cluster_name: target_backend
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: your-target-backend
              port_value: port

Envoy的codec_type: AUTO会自动处理h2c和HTTP/1.x的请求,转发到后端时默认使用HTTP/1.1,完全满足你的需求。

为啥不推荐HAProxy和Apache?

  • HAProxy:目前官方确实不支持无TLS的HTTP/2监听,HTTP/2必须依赖TLS/ALPN协商,所以h2c场景下HAProxy暂时用不了。
  • Apache:虽然mod_proxy_http2支持HTTP/2,但要实现h2c监听器非常麻烦,需要手动处理Upgrade请求,而且没有原生的h2c监听支持,配置复杂容易踩坑,真心不推荐。

总结下来,Nginx或者Caddy是最简便的选择——如果已经在用Nginx,直接加个server块就行;如果是新搭建服务,Caddy的配置成本几乎为零,非常省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:24