Rewrite URL 重写概述
rewrite 主要实现url地址重写,以及url地址跳转
将用户请求的web服务器的URL地址重新改为其他URL地址的过程
列入我们访问58.com
会自动跳转到 bj.58.com
(因为我当前在北京)
使用场景
1.地址跳转
2.协议跳转
3.URL静态化
Rewrite 重写原理
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'