Nginx跳转

旧文新发

任务背景

线上服务器分中英文,使用了MultilingualPress插件进行跳转。因为其他的BUG,前端的同事在线上服务器运行了git reset --hard,之前负责的的同事对代码进行的修改并没有commit,并且他已经离职了。在勉强运行服务之后,运营的同事发现根据浏览器的语言进行跳转的功能失效。

修复过程

首先在本地服务器上构建了一个线上代码的镜像,实现方式是将线上环境的代码压缩之后部署到本地,使用和线上版本一致的lnmp环境。根据离职的那位同事留下的readme.md部署成功。 本地测试的时候,没有复现问题。 因为对WordPress框架不熟悉,于是想通过Nginx实现跳转,在查找配置文件的时候才发现,线上服务的vhost/www.xxxx.xx.conf与代码中的不一致,与readme.md也不一致。

Nginx基于浏览器语言跳转

在浏览器访问服务器的时候,会在请求头中加入Accept-Language,在nginx中,这个参数是$http_accept_language。因此我们判断$http_accept_language中是否存在zh字符串,如果有就跳转到中文网站,如果没有就跳转到英文网站(默认英文)。 在vhost/www.xxxx.xx.conf中添加以下代码:

1
2
3
4
5
6
7
set $lang '/?noredirect=en_US';
if ($http_accept_language ~* ^zh(.*)){
    set $lang '/zh-home/?noredirect=zh-CN';
}
if ($request_uri ~* "^/$"){
    rewrite ^/$ $lang permanent;
}

Nginx配置踩坑记录

  • nginx配置文件中的if之后必须要有一个空格。
  • nginx不支持if嵌套,如果需要多个判断,则需要使用参数进行区分。例如,想要请求头中的Accept-Language包含zh的同时,$request_uri中还有lang=zh的同时才显示中文,那么配置文件如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
set $flag 0;
if ($http_accept_language ~* ^zh(.*)){
    set $flag "${flag}1";
}
if ($args ~* lang=(\\w+?)(&|$)) {
    set $lang $1;
}
if ($lang = "zh"){
    set $flag "${flag}1"
}
if ($flag = "011"){
    rewrite ^/(.*) /zh/$1 permanent;
}
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy