前言
前段时间在使用 apisix 添加路由时,需要将 http 转为 https, 在配置 http_to_https 后,访问相应网址时发现 https 的端口不是我们所配置的默认端口 443,而是 9443 端口。
可以看到访问 http://localhost 会跳转至错误的地址: https://localhost:9443/ ,正确的地址应该是 https://localhost,这是怎么回事呢?
分析
接下来我来简单对问题进行简单分析。
我是采用 docker 的方式部署的apisix,这是我们的配置文件:
version: "3"
services:
apisix-dashboard:
image: apache/apisix-dashboard:3.0.0-alpine
restart: always
volumes:
- ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
ports:
- "9000:9000"
networks:
apisix:
apisix:
image: apache/apisix:${APISIX_IMAGE_TAG:-3.2.0-debian}
restart: always
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
depends_on:
- etcd
##network_mode: host
ports:
- "9180:9180/tcp"
- "80:9080/tcp"
- "9091:9091/tcp"
- "443:9443/tcp"
- "9092:9092/tcp"
networks:
apisix:
etcd:
image: bitnami/etcd:3.4.15
restart: always
volumes:
- etcd_data:/bitnami/etcd
environment:
ETCD_ENABLE_V2: "true"
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ports:
- "2379:2379/tcp"
networks:
apisix:
web1:
image: nginx:1.19.0-alpine
restart: always
volumes:
- ./upstream/web1.conf:/etc/nginx/nginx.conf
ports:
- "9081:80/tcp"
environment:
- NGINX_PORT=80
networks:
apisix:
networks:
apisix:
driver: bridge
volumes:
etcd_data:
driver: local
可以看到我们将 apisix容器的 http端口和 https端口映射为 80和443,按照常理来说,http_to_https 后的端口应该也是443端口才对。我猜测重定向时,apisix还是采用配置文件中设定的https 端口才导致跳转的url端口错误。
解决
经过搜寻相关issue,发现了采用端口的顺序; 于是有几种解决方法:
1 配置 plugin_attr.redirect.https_port 属性
2 修改配置文件中的默认https端口
3 使用 serverless 插件,进行相应的重定向处理