如何通过API网关Apache APISIX将客户端HTTP请求重定向至HTTPS
Apache APISIX 实现HTTP到HTTPS重定向的方案与原理
常规实现方案
- 插件配置方式
最通用的实现是使用官方内置的redirect插件,你可以根据生效范围把插件绑定在全局规则、指定服务或者单条路由上:
配置里# 示例:给全局规则绑定redirect插件实现全站跳转 curl http://127.0.0.1:9180/apisix/admin/global_rules/1 -H 'X-API-KEY: your-admin-key' -X PUT -d ' { "plugins": { "redirect": { "http_to_https": true, "ret_code": 301 } } }'ret_code字段可以自定义返回的状态码,默认是302临时跳转,做永久跳转推荐设为301,对搜索引擎更友好。 - K8s Ingress场景快速配置
如果是在Kubernetes集群中使用APISIX Ingress,不需要手动调用Admin API,直接给对应的Ingress资源添加注解k8s.apisix.apache.org/http-to-https: "true"即可开启对应域名的跳转。
更便捷的内置方案
如果你不需要对特定域名、路径做跳转豁免,优先用APISIX原生内置的全局跳转开关,比插件方案性能更好,配置也更简单:
直接修改APISIX配置文件conf/config.yaml,在http配置块下开启enable_http_to_https参数即可:
apisix: http: listen: 9080 enable_http_to_https: true # 开启后所有HTTP端口的请求自动跳转HTTPS https: listen: 9443
修改完重启APISIX就会全局生效,不需要额外配置任何插件,也不会占用插件执行的性能开销。如果有部分路径需要跳过跳转,还是推荐用redirect插件,通过exclude_uri或者exclude_host参数配置白名单。
重定向功能工作原理
整个重定向流程分三个核心环节:
- 请求协议识别
首先判断当前请求的来源:如果是HTTP监听端口收到的明文请求,直接命中跳转规则;如果是HTTPS端口收到、但请求头里携带的X-Forwarded-Proto值为http(适配前端挂载了CDN、SLB等四层/七层代理的场景),同样会命中跳转规则。 - 跳转地址拼接
规则命中后,会自动从请求头提取Host字段作为目标域名,保留原始请求的URI路径、查询参数,把协议前缀替换为https://,如果HTTPS监听端口不是默认443,会自动在域名后拼接对应端口,不需要手动配置域名规则。 - 跳转响应返回
服务端会给客户端返回你配置的跳转状态码,同时在响应头的Location字段写入拼接好的HTTPS地址,客户端收到响应后会自动向HTTPS地址发起新的请求。
踩坑提示:如果APISIX前端挂了其他反向代理,一定要确保前端代理正确传递
X-Forwarded-Proto头,否则会出现HTTP跳HTTPS的死循环问题。
内容的提问来源于stack exchange,提问作者feihan
相关产品推荐
相关产品推荐

