Kong作为重定向服务

Posted

技术标签:

【中文标题】Kong作为重定向服务【英文标题】:Kong as redirection service 【发布时间】:2021-04-14 15:06:47 【问题描述】:

是否可以在 KONG 中配置 HTTP 重定向规则(例如,如果请求匹配 ^/old-api/(.*)$ 模式,则返回 301 到 https://other-domain.org/new-api/$1)而不修改 nginx.conf 模板(即使用 API 和一些插件设置此类规则)?

我想要实现的是 nginx 等效于 rewrite 指令与 redirectpermanent 标志:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

【问题讨论】:

【参考方案1】:

编辑:我现在找到了更好的答案。

使用Serverless function plugin,可以使用Location 标头进行正确的重定向。下面的 Lua 代码应该这样做:

kong.response.exit(301, 'page moved - redirecting...', ['Location'] = 'https://other-domain.org/' .. kong.request.get_path_with_query():gsub("%/old-api/", "/new-api/"))

之后,响应如下:

# curl -i http://original-domain.org/old-api/abc
HTTP/2 301
date: Sat, 09 Jan 2021 17:03:04 GMT
location: https://other-domain.org/new-api/abc
content-length: 28
x-kong-response-latency: 7

page moved - redirecting...

原答案

您可以在路由定义中使用正则表达式和capturing groups 将路径(或其中的一部分)保存在变量中:

^/old-api/(?<path>.*)$

遗憾的是,响应转换器不能像Request Transformer Plugin 那样简单地使用path 变量来创建Location: https://other-domain.org/new-api/$(uri_captures.&lt;path&gt;) 标头(参见https://konghq.com/blog/url-rewriting-in-kong)。

如果你只想重定向一个 html 页面,你至少可以通过使用Request Termination Plugin 并设置status_code=301 使路由响应代码 301。也可以返回text/htmlmime-type 并返回

<script>location.href = 'https://other-domain.org/new-api/' + location.pathname.replace(/^\/old-api/, '/new-api')</script>

在body中规避这个限制。

另一种方法是自己实现一个 Kong 插件(我不知道现有的插件,除了一个非常基本的 https://github.com/domecloud/kong-plugin-redirect,它可能会被扩展)。

PS:我刚刚发现another promising plugin 似乎更强大,虽然我还没有测试它。

【讨论】:

以上是关于Kong作为重定向服务的主要内容,如果未能解决你的问题,请参考以下文章

Kong背后的Keycloak和奇怪的重定向

kong api网关保持url地址插件

Nginx地址重定向使用

SimpleSamlPhp 作为 SP 重定向不正确

管道符重定向与环境变量

为啥 rev 规范链接总是使用 302 重定向