1. 什么是Nginx Rewrite
和Apache等Web服务软件一样,Nginx Rewrite的主要功能也是实现URL地址重写,Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配,前面在安装Nginx软件时就已经安装了这个PCRE软件,以及让Nginx支持Rewrite的功能,默认参数编译Nginx就会安装支持Rewrite的模块,但是,也必须要PCRE软件的支持,Nginx Rewrite的典型企业应用就是伪静态功能的实现。
2. Nginx Rewrite语法
2.1 Rewrite指令语法
指令语法:Rewrite regex replacement [flag];
默认值:none;
应用位置:server、location、if。
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
在上述指令中,Rewrite为固定关键字,表示开启一条Rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,匹配所有,匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,结尾permanent;表示永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。
2.2 regex常用正则表达式说明
下表为regex常用正则表达式字符的一部分。
regex常用正则表达式字符1 regex常用正则表达式字符22.3 Rewrite指令结尾的flag标记说明
Rewrite指令最后一项参数为flag标记该标记说明见下表。
Rewrite指令最后一项参数flag标记的说明在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
last和break标记的实现功能类似,但两者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条Rewrite规则执行完毕后,会对其所在的server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3. Nginx Rewrite的企业应用场景
Nginx的Rewrite功能在企业里应用非常广泛:
- 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎收录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
- 网站换新域名后,让旧的域名的访问跳转到新的域名商上,如让京东的360buy换成了jd.com。
- 根据特殊变量、目录、客户端的信息进行URL跳转等。
4. Nginx Rewrite 301跳转
以往我们是通过别名的方式实现etiantian.org和www.etiantian.org访问同一个地址的,事实上,除了这个方式以外,还可以使用Nginx Rewrite 301跳转的方式实现。实现的配置如下:
[root@web01 conf]# cat extra/01_www.conf
server {
listen 80;
server_name etiantian.org;
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
---当用户访问etiantian.org及下面的任意内容时,都会通过这天Rewrite跳转到www.etiantian.org对应的地址
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main gzip buffer=12k flush=5s;
}
浏览器访问效果如下图所示:
访问前的地址 访问后的地址5. 实现不同域名的URL跳转
例1:实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/oldboy.html。
外部跳转时使用这种方法,浏览器地址会变为跳转后的地址,另外,要实现设置http://www.etiantian.org/blog/oldboy.html有结果输出,不然会出现401等权限错误。
配置Nginx rewrite规则
跳转前http://blog.etiantian.org对应站点的配置如下:
[root@web01 conf]# cat extra/03_blog.conf
server {
listen 80;
server_name blog.etiantian.org;
location / {
root html/blog;
index index.html index.htm;
}
---下面4行为要配置的规则内容
if ( $http_host ~* "^(.*)\.etiantian\.org$") {
set $domain $1;
rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break;
}
access_log logs/access_blog.log main;
}
跳转后http://www.etiantian.org/blog/oldboy.html地址对应的站点配置如下:
[root@web01 conf]# cat extra/01_www.conf
server {
listen 80;
server_name www.etiantian.org etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main gzip buffer=12k flush=5s;
}
客户端访问测试效果
注意:对应的html文件要事先创建好。
例2:某公司早先只有一个域名www.etiantian.org,因此,将bbs论坛部署到了www.etiantian.org域名下的bbs目录下了,现在想启用bbs.etiantian.org做bbs的域名,需要实现访问http://www.etiantian.org/bbs跳转到http://bbs.etiantian.org。
1)在etiantian.org下设置Nginx Rewrite规则。
[root@web01 conf]# cat extra/01_www.conf
server {
listen 80;
server_name www.etiantian.org etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
rewrite ^(.*)/bbs/ http://bbs.etiantian.org break;
access_log logs/access_www.log main gzip buffer=12k flush=5s;
}
[root@web01 conf]# cat extra/02_bbs.conf
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bbs.log main;
}
2)访问前后的效果对比。
访问前的地址 访问后的地址**有关Rewrite特殊flag标记last与break的说明:
在跟location(即location/{……})中或者server{……}标签中编写Rewrite规则,建议使用last标记,而在普通的Location(例location /lodboy/ {……})或if{}中编写Rewrite规则,则建议使用break标记。
企业场景中运维人员需要掌握多少Rewrite技术?
简单的URL跳转,运维人员可以直接搞掂,复杂规则,如伪静态实现是和业务相关的,一般是开发人员写好并测试成功,然后发给运维到正式环境部署执行。
网友评论