我们这有个内部网站同时支持 2 个域名访问,最近因升级需求希望统一到一个域名,即老域名做一个 301 跳转到新域名。这个在 Nginx 直接配置一个 if 逻辑,判断是老的 host 并跳转到新的域名即可。那这个 Case 在 APISIX 里面应该怎么配置呢?
看了下 APISIX 文档,发现有两种跳转插件:redirect和response-rewrite,前者只能跳转 uri 不包含协议主机部分,后者可以通过修改返回头和状态码来实现跳转。
因此,这里选择response-rewrite来实现,经过一番验证,最终配置(信息已简化处理)如下:
{
"uris": [
"/*"
],
"hosts": [
"www.domain1.com",
"www.domain2.com"
],
"plugins": {
"response-rewrite": { # 跳转插件配置
"disable": false,
"headers": {
"Location": "$schema://www.domain2.com$uri" # 跳转到 www.domain2.com
},
"status_code": 301,
"vars": [
[
"host",
"==",
"www.domain1.com" # 当用户访问的是 www.domain1.com 的时候才跳转
]
]
}
},
"service_id": "demo_service",
"status": 1
}
上述路由配置的跳转逻辑为:当访问域名是 www.domain1.com 时,跳转到 www.domain2.com。可以看到,通过response-rewrite 插件,我们仅用一个路由就满足了上述跳转需求,但是这个方法有个弊端,就是这个插件其实是在请求完后端之后生效的,因此这个请求其实已经到了后端服务,然后才跳转的,不是特别优雅。
很不错