在这篇文章中,我们将展示如何根据客户端的不同语言设置重定向到不同的网页。

嵌入图片

假设我们有一个支持在不同路径下展示不同语言的源站。例如,这是 /cn/ 路径。

1
2
$ curl 'http://test-edge.com/en/'
Hello, world!

注意这里是中文, “你好,世界!”。

/fr/ 路径下还有一个法语版本。

1
2
$ curl 'http://test-edge.com/fr/'
Bonjour, le monde!

这里显示的是法语。

今天设置的目标是,当客户端访问根路径 / 时,我们可以根据其语言配置自动重定向到特定语言的路径下。我们将使用客户端发送的 Accept-Language 请求头。

嵌入图片

像往常一样,让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们控制台的样本部署。每个用户都有自己的本地部署。

这一次我们继续使用 test-edge.com 域名的样本应用。

进入这个应用。

屏幕截图

我们已经定义了一个上游。

屏幕截图

这个 my backend 上游只有一个后端服务器。也就是我们在视频开头使用的源站。

屏幕截图 而且我们也有一个已经定义好的页面规则。

屏幕截图 这个页面规则设置了一个反向代理到我们刚才看到的 my backend 上游。

屏幕截图 创建一个新的页面规则。

屏幕截图 我们启用一个规则条件来检查 URI /

屏幕截图 这个下拉框里列出了所有我们可以选择的变量。

屏幕截图 选择变量 URI

屏幕截图 运算符选择字符串等号。

屏幕截图

屏幕截图 输入值 /,表示只匹配根路径。

屏幕截图 第二个条件用来检查语言。

屏幕截图

屏幕截图 我们选择 Request header 作为变量。

屏幕截图 输入请求头名称 Accept-Language

屏幕截图 运算符这里,

屏幕截图 我们选择“前缀”。

屏幕截图 这表示当同时指定多种语言时,我们只关心第一种。

我们选择正则表达式类型 Regex 作为匹配的值。

屏幕截图

屏幕截图 输入正则值 fr\b

屏幕截图 \b 的意思是匹配一个词的边界。这样写 frfr-CA 都会匹配得到。

这里,我们勾选“忽略大小写”以进行不区分大小写的匹配。

屏幕截图 现在我们有了以 AND 相连接的两个条件。也就是说,必须同时满足这两个条件,才能执行下面的动作。已经完成条件的编写。

现在我们添加一个新的动作。

屏幕截图 搜索动作“重定向”。

选择动作类型“重定向”。

屏幕截图 然后我们配置跳转到的目标 URI 。

屏幕截图 选择“自定义”。我们要自己输入 URI 。

屏幕截图 输入 /fr/

屏幕截图 保持其余字段不动。

屏幕截图 如果命中此条规则的话跳过所有余下的页面规则。

屏幕截图 我们需要确保这条规则总是在其他规则之前运行。我们把它标记为一个置顶规则。置顶规则不是一个普通规则。

屏幕截图 保存这个规则。

屏幕截图 我们可以看到新添加的页面规则确实置顶在规则列表。

屏幕截图 它确实出现在我们之前的代理规则之前。

和以往一样, 我们需要发布这条规则以使其生效。

屏幕截图

屏幕截图 发布!

屏幕截图 这里可以看到同步完成了。

屏幕截图 现在,新的页面规则已经被推送到所有的网关集群和服务器。

我们的配置变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。

嵌入图片

在终端上,我们可以用 curl 发送 HTTP 请求。

1
curl -I -H 'Accept-Language: fr-CA, fr, en' http://test-edge.com/

这里我们指定了 3 种语言:fr-CA, fr, 和 en 。所以对于这个请求,法语优先于英语。

屏幕截图

运行这个命令。

注意看这里确实重定向到了 /fr/

屏幕截图

我们可以让 curl 命令自动跟随重定向。

1
curl -L -H 'Accept-Language: fr, en' http://test-edge.com/

这里使用 -L 选项。

屏幕截图

运行这个命令。

我们可以看到返回的法语文本。

屏幕截图

接下来,我们会添加一个通用的页面规则以实现当客户端发送的请求头带有其他语言时重定向到英文页面。

屏幕截图 创建一个新的页面规则。

屏幕截图 我们仍然启用一个规则条件来检查 URI /

屏幕截图

屏幕截图 仍然选择 URI

屏幕截图 仍然选择字符串等号。

屏幕截图

屏幕截图 像以前一样输入值 /

屏幕截图 条件编写完成。这一次我们不用再去检查请求头了。

像上次一样添加一个新的重定向动作。

屏幕截图

屏幕截图

屏幕截图

屏幕截图 这一次,我们为目标 URI 输入 /en/

屏幕截图 如果命中此条规则的话跳过所有余下的页面规则。

屏幕截图 我们仍然要确保这个规则在其他“普通规则”之前运行。

屏幕截图 保存这个规则。

屏幕截图 我们可以看到新添加的页面规则在代理规则之前,但在上次添加的那条法语规则之后。

屏幕截图 再做一次新配置的发布。

屏幕截图

屏幕截图 再次发布!

屏幕截图 同步又完成了。

这次我们使用浏览器测试 / 路径。我们的浏览器的语言设置是英文。

这里可以看到返回的是英文文本 Hello, world。

屏幕截图 从地址栏我们还可以看到,URI 变成了 /en/

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Demo 系统从一个极简单的剧本文件自动生成的。

关于作者

章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,相当多 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty EdgeOpenResty XRay 等产品。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!