现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会遇到很多跳转(重写 URL)的需求。
1.Rewrite 跳转场景
Rewrite 跳转场景主要包括以下几种:
1.可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
2.为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3.网址换新域名后,让旧的访问跳转到新的域名上。
4.根据特殊变量、目录、客户端的信息进行 URL调整等。
2.Rewrite 跳转实现
Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持if条件判断,但不支持 else。另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location 跳转到另一个location,不过这样的循环最多可以执行 10 次,超过后 Nginx 将返回 500 错误。
3.Rewrite 实际应用场景
在实际工作的应用中,Nginx跳转需求有三种方式可实现。可以直接用rewrite 进行匹配跳转,也可以使用if匹配全局变量后跳转。另外,还可以使用location 匹配再跳转。
4.Nginx 正则表达式
Nginx Rewrite 基本操作
Rewrite 语法
regex 表示正则匹配规则、replacement 表示跳转后的内容、flag 表示 rewrite 支持的 fag 标记。
rewritecregex><replacement>[flag]:
last:相当于 Apache 的[L]标记,表示完成 rewrite.
break:本条规则匹配完成即终止,不再匹配后面的任何规则。
redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新url
permanent:返回 301永久重定向,浏览器地址栏会显示跳转后的 URL地址,爬虫更新 url。
Location 分类
location 大致可以分为三类
location = patt {[精准匹配]
location patt {}[一般匹配]
location ~ patt &}[正则匹配]
~:表示执行一个正则匹配,区分大小写。
~*:表示执行一个正则匹配,不区分大小
!~:表示执行一个正则匹配,区分大小写不匹配。
!~*:表示执行一个正则匹配,不区分大小写不匹配。
~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location。
=:进行普通字符精确匹配,也就是完全匹配。
@:它定义一个命名的 location,使用在内部定向时,例如 error _page,try fles。
Rewrite 常见示例
安装 Nginx 服务
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rom
yum install -y nginx
修改 Nginx 默认站点配置文件
修改/etc/nginx/conf.d/default.conf文件中如下两行
vim /etc/nginx/conf.d/default.conf
server {
listen80:
server_name www.aaa.com
#charset koi8-r;
access_log ivarloginginxww.aaa.com-access.log main;
location / {
root/usr'share/nginx/htmi;
index index. html index.htm;
}
#eror_page 4041404.himi;
systemctl start nginx
Rewrite 示例
基于域名的跳转
vim /etcinginx/conf/ddefauit.conf
if ($shost = 'www.aaa.com')
{
rewrite “/(.")$ http:ww.newaaa.com$1 permanent;
}
systemctl reload nginx
1)域名直接跳转
按 F12 可以清楚的看到从旧域名 www.aaa.com 跳转到了新域名 www.newaaa.com 上状态码是 301 永久重定向
2)域名后面加参数跳转
因为在代码中很多请求是带参数的,所以要保证参数都能正常跳转。浏览器输入模拟访问 http:/lwww.aaa.com/test/1fndex.php(虽然这个请求内容是不存在的)跳转到http://www.newaaa.com/test/1/index.php,可以看到 301 实现了永久重定向跳转,而且域名后的参数也正常跳转
基于客户端|P访问跳转
vim /etcinginx/conf.d/default.conf
set $rewrite true;
if ($remote addr= "192.168.6.125"){
set $rewrite false;
if ($rewrite = true) {
rewrite (.+)/maintenance.html;
}
location=/maintenance.html {
root /usr/share/nginx/html;
}
echo"Website is Maintaining,Please visit later.">/usr/share/nginx/htmlmaintenance.html
systemctlreload nginx
基于旧域名跳转到新域名后面加目录
例如现在访问的是 http:/bbsaaa
.com,现在需要将这个域名下面的发帖都跳转到http:/wnw.aaa.combbs,注意保持域名跳转后的参数不变。
vim /etc/nginx/conf.d/default.conf
server_name bbs.aaa.com;
location /post {
rewrite (.+) hitp:/iww.aaa.comibbs$1 permanent;
systemetl reload nginx
模拟使用浏览器访问http://bbs.aaa.compost/1.php 跳转到http:/hwnw.aaa.combbs/post/1.php