目录
前言
现在 Nginx 已经成为很多公司作为前端反向代理(proxy_pass)服务器的首选,在实际工作中往往会遇到很多跳转(重写 URL)的需求。
一、跳转实现方式
使用rewrite进行匹配跳转(主要匹配的是具体的路径)
使用if匹配全局变量后跳转
使用location匹配再跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)
二、常用的Nginx 正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
\w :匹配字母或数字或下划线或汉字
\s :匹配任意的空白符
\b :匹配单词的开始或结束
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置 例如:(jpg|gif|swf|)
| :或运算符从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域,location 是对一类路径做控制访问或反向代理,还可以 proxy_pass 到其他机器。
三、 Rewrite跳转
1、跳转场景
1、调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
2、为了让搜索引擎搜寻网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3、网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到 jd.com。
4、服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行URL调整等。
URL 匹配和 重新跳转新的URL
2、rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
3、rewrite 执行顺序
(1) 执行 server 模块里面的rewrite 指令。
(2) 执行选定的 location 中的rewrite 指令。
(3) 执行选定的location中 if 中的rewrite指令
示例:
http {
server {
rewrite # 优先级1
location ~*\.(jpg|gif|swf)$ {
rewrite # 优先级2
valid_referers none blocked *.dog.com dog.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.dog.com/error.png; #优先级3
}
}
}
}
四、location 匹配
1、常用的匹配
=:进行普通字符精确匹配,也就是完全匹配
^~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location
~:区分大小写的匹配
~*:不区分大小写的匹配
!~:区分大小写的匹配取非
!~*:不区分大小写的匹配取非
@:定义一个location,使用在内部定向的时候
2、location 优先级
相同类型的表达式,字符串长的优先匹配
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配,示例:/images/abc/1.html
最后是交给 / 通用匹配
五、 基于域名的跳转
需求:现在公司旧域名www.abc.com有业务需求变更,需要使用新域名www.ben.com代替
vim /etc/hosts
192.168.154.131 www.abc.com www.ben.com
#先改主机域名
mkdir -p /var/log/nginx
#创建需要指向的目录
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.abc.com;
charset utf-8;
access_log /var/log/nginx/www.abc.com-access.log;
location / {
if ($host = 'www.abc.com'){
rewrite ^/(.*)$ http://www.ben.com/$1 permanent;
}
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#配置文件
nginx -t
systemctl restart nginx
#检查配置文件语法重启服务
此时打开浏览器,访问 http://www.abc.com 时会自动跳转至http://www.ben.com
总结
我们要了解rewrite的功能与跳转场景,以上只是基于域名跳转同理还要掌握基于IP跳转和匹配规则。