Nginx rewrite
Posted 水木,年華
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx rewrite相关的知识,希望对你有一定的参考价值。
nginx rewrite
前言
现在Nginx已经成为很多公司作为前端反向代理(proxy pass)服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的 Apache服务器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高
一.Rewite跳转场景
1、调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
2、为了让搜索引擎搜寻网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3、网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到jd.com。
4、服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行URL调整等。
URL匹配和重新跳转新的URL
二.Rewrite跳转实现
Nginx:通过ngx http rewrite module模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个iocation跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误PCRE支持: perl兼容正则表达式的语法规则匹配
重写模块set指令:创建新的变量并设其值
三.Rewrite实际场景
3.1Nginx跳转需求的实现方式
①使用rewrite进行匹配跳转
②使用if匹配全局变量后跳转
③使用location匹配再跳转
3.2rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用
例如:www.baidu.com/bbs/install/index.php
location只对/bbs/install/index.php起作用
3.3对域名或参数字符串
①使用if全局变量匹配
②使用proxy_pass反向代理
3.3rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server( ),location( },if( }中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,例如 http://www .dabao.com/a/we/index.php?id=1&u=str只对/a/we/index.php重写。
四.Nginx正则表达式
常用的正则表达式元字符
五.rewrite执行顺序
①执行server块里面的rewrite指令。
②执行选定的location中的rewrite指令。
③执行选定的location中 if 中的rewrite指令
六. Rewrite命令
6.1Rewrite命令语法
rewrite <regex> <replacemnt> [flag];
正则 跳转后的位置 flag其他要求,其他规则
3.2flag标记说明
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
6.3last和break比较
从功能看rewrite和 location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域,location
是对一类路径做控制访问或反向代理,还可以proxy pass到其他机器。
七.location分类
7.1分类
①location = patt [精准匹配]
②location patt [一般匹配]
③location ~ patt [正则匹配]
7.2 location优先级
相同类型的表达式,字符串长的会优先匹配
按优先级排列
= 类型
^~类型表达式
正则表达式(和*)类型
常规字符串匹配类型,按前缀匹配
通用匹配(/) ,如果没有其它匹配
任何请求都会匹配到
比较 rewrite和location
相同点
都能实现跳转
7.3 rewrite和location不同点
①rewrite是在同一域名内更改获取资源的路径
②location是对一类路径做控制访问或反向代
理,还可以proxy_pass到其他机器
rewrite会写在rewrite里,执行顺序
①执行server块里面的rewrite指令
②执行location匹配
③执到选定的location中的rewrite指令
7.4 location优先级规则
匹配某个具体文件
(location =完整路径) > (location ^~完整路径)>(location
*完整路径)>(location完整路径(location完整路径)> (location /)
用目录做匹配访问某个文件 (location =目录) > (location ^~目录/) > (location~目录) >(location
~*目录)>(location 目录 )> (location /)
八.总结
Nginx跳转需求的实现方式:
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转
location有哪几类:
精确,普通和正则
location优先级规则:
1.“=”精确
2."^~"正则前缀匹配
3.正则匹配
4.普通前缀匹配
5.“/”匹配
九.实际网站中三个匹配规则定义
9.1第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器
location = / {
roothtml;
index index.html index. htm;
}
9.2第二个必选规则
处理静态文件请求,这是nginx作为http服务器的强项有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ l static/ {
root /webroot/ staticl ;
}
location ~* \\. (html Igif ljpg ljpeglpnglcssljslico)$ {
root /webroot / res/ ;
9.3第三个规则
就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器非静态文件请求就默认是动态请求
upstream tomcat_server {
192.168.80.1:80
192.168.80.2:80
}
location / {
proxy_pass http: //tomcat server;
}
十.实际配置
1.1基于域名的跳转
要求:现在公司旧域名www . my.com有业务需求变更,需要使用新域名www.host.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
①在服务端添加域名映射
echo "192.168.80.2 www.my.com www.host.com" >> /etc/hosts
②创建日志目录
mkdir -p /var/log/nginx
③修改配置文件
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.my.com; #域名修改
#charset koi8-r;
access_log /var/log/nginx/www.kgc.com-access.log; #开启并对日志保存路径进行修改
location / { #在原有location位置插入
if ($host ='www.my.com') { #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite^/(.*)$ http:// www.host.com/$1 permanent; #$1为匹配的位置变量,即域名后边得字符串,同时永久跳转
}
root html;
index index.html index.htm;
④访问
此时访问http:// www.my.com时会自动跳转到 www.host.com上进行访问
同时,可以访问www.my.com/1.html在显示错误页面的同时可以看到域名也会变化为www.host.com/1.htm1
10.2基于IP地址访问的跳转
要求:今天公司业务新版本上线,要求所有IP 访问任何内容都显示一个固定维护页面,只有公司IP 192.168.80.2访问正常。
①第一步删除上一个操作的配置
②修改配置文件
③创建维护网页
mkdir -p /var/www/html
echo "<h1>weihu zhong </h1>" > /var/www/html/weihu.html
④重启服务
systemctl restart nginx
⑤访问
此时用宿主机访问192.168.80.2时会跳转到weihu.html界面,而只有IP为192.168.80.2的本机才可以正常进行访问。
本机正常访问
宿主机访问时维护
以上是关于Nginx rewrite的主要内容,如果未能解决你的问题,请参考以下文章
apache与nginx在移动终端访问是的rewrite配置