Linux Nginx Rewrite 跳转应用

Rewrite URL 重写概述

rewrite 主要实现url地址重写,以及url地址跳转
将用户请求的web服务器的URL地址重新改为其他URL地址的过程
列入我们访问58.com 会自动跳转到 bj.58.com(因为我当前在北京)

使用场景

1.地址跳转
2.协议跳转
3.URL静态化

Rewrite 重写原理

Linux Nginx Rewrite 跳转应用_第1张图片
image-20191122204605390.png

rewrite 相关重写模块

  • set 设置变量
  • if 负责语句中的判断
  • return 返回返回值或URL
  • rewrite 重定向URL

rewrite 重写模块

set 自定义变量,if判断语句
SYNTAX: set  $varialbe value
default: -
context:server,location,if
if 指令语法
SYNTAX: set  if(condition) { ... }
default: -
context:server,location

# ~ 模糊匹配
# ~* 不区分大小写的匹配
# !~ 不匹配
# = 精确匹配
set、if指令场景示例:

需求1: 用户请求url 跳转到url.onelpc.com/zh
需要2:用户请求url 跳转到url.onelpc.com/en

# 准备环境
[root@web ~]# mkdir /code/zh
[root@web ~]# mkdir /code/en
[root@web ~]# echo "zh" >/code/zh/index.html
[root@web ~]# echo "en" >/code/en/index.html
# 添加hosts解析
[root@web ~]# cat /etc/hosts
10.4.7.7    url.onelpc.com url.onelpc.com.zh url.onelpc.com.en
# 编写配置文件
[root@web ~]# cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    location / {
    root /code;
    }
}
server {
    listen 80;
    server_name url.onelpc.com.zh url.onelpc.com.en;
    location / {
        if ( $http_host ~* "zh") {
               set $language zh;
        }
        if ( $http_host ~* "en") {
               set $language en;
        }
     rewrite ^/$ http://url.onelpc.com/$language redirect;
    }
}
# 重启nginx服务
[root@web ~]# systemctl restart nginx.service

# 测试结果
[root@web ~]# curl -L url.onelpc.com.en
en
[root@web ~]# curl -L url.onelpc.com.zh
zh
return 返回数据

return 指令语法

SYNTAX: sreturen code;
return code [test];
return URL;
default: -
context:server,location,if

return 指定场景示例

需要:如果用户请求url.onelpc.com/test 则返回值www.bossx.club

[root@web ~]# cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    root /code;
    location /test {
        default_type text/html;
        if ( $request_uri ~* "^/test"){
        #return  200 "ONE_lpc";
        return   302 https://www.bossx.club;
        }
    }
    
}
# 测试
# return  200 "ONE_lpc";  返还一句话
# return   302 https://www.bossx.club;  网站跳转

Rewrite URL 重写语法

Rewrite 重写URL、或跳转其他URL

#        关键字    正则    替代内容      flag标记
SYNTAX: rewrote   regex  replacement     [flag];
default: -
context:server,location,if


# flag
last        #本条规则匹配完成后,继续向下匹配新的location URL规则
break       #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect    #返回302临时重定向,地址栏会显示跳转后的地址
permanent   #返回301永久重定向,地址栏会显示跳转后的地址

Rewrite的Flag标记,break 和last 区别

环境准备

# 环境准备
echo "111111" >/code/1.html
echo "222222" >/code/2.html
echo "333333" >/code/3.html
echo "aaaaaa" >/code/a.html
echo "bbbbbb" >/code/b.html

相关代码示例

[root@web ~]#  cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    root /code;
    
    #location1
    location / {
        rewrite /1.html /2.html break;
        rewrite /2.html /3.html;
    }
    #location2
    location /2.html {
        rewrite /2.html /a.html;
    }
    
    #location3
    location /3.html {
        rewrite /3.html /b.html;
    }
} 



#测试结果
[root@web ~]# curl -L url.onelpc.com/1.html
222222
# 当请求 /1.html,最后会访问/2.html
#在location{}内存,遇到break,本location{}内以及后面的所有location{}内的所有指令都不再执行

last

[root@web ~]#  cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    root /code;
    
    #location1
    location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html;
    }
    #location2
    location /2.html {
        rewrite /2.html /a.html;
    }
    
    #location3
    location /3.html {
        rewrite /3.html /b.html;
    }
} 

#测试结果
[root@web ~]# curl -L url.onelpc.com/1.html
aaaaaa
# 访问/1.html,最终访问到/a.html
# 在location{}内部,遇到last,当前location{}内后续指令不再纸芯
#而重写后的url会在对所在的server{...}标签重新发起请求,从头开始匹配规则

rewrite 跳转生产实践

场景1:根据用户浏览器语言,自动跳转至不同的页面

基于请求头实现: accept-language

[root@web ~]# cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    root /code;
    index  index.html;

    if ( $http_accept_language ~* "zh|zh-CN"){
          set $language zh;
    }
    if ( $http_accept_language ~* "zh|zh-CN"){
          set $language zh;
    }
   
    rewrite ^/$ /$language;    
}

场景2:根据用户来源终端设备跳转至不同站点目录或域名

基于请求头:

[root@web ~]# cat /etc/nginx/conf.d/url.onelpc.com.conf 
server {
    listen 80;
    server_name url.onelpc.com;
    root /code;
    index  index.html;

    if ( $http_user_agent  ~* "iphone|android"){
          rewrite ^/$ /m ;   #跳转目录
          rewrite 302 http://m.onelpc.com$request_uri; #跳转域名
    }
}

场景3: 根据用户请求跳转:请求api.xx.com/id,调试跳转到 http://demo:8925/ipa/id

[root@web ~]# cat /etc/nginx/conf.d/url.onelpc.com.conf
server {
    listen 80;
    server_name url.onelpc.com;

    if ( $http_host  ~* (.*)\.(.*)\.(.*)) {
            set $domain $1;
    }
    rewrite ^/(.*)$ http://demo:27610/$domain/$1 last;
}


# 测试#最终访问的地址
[root@web ~]# curl -Lv url.onelpc.com/aaa
* About to connect() to url.onelpc.com port 80 (#0)
....
* Connection #0 to host url.onelpc.com left intact
* Issue another request to this URL: 'http://demo:27610/url/aaa' 

你可能感兴趣的:(Linux Nginx Rewrite 跳转应用)