栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Nginx Rewrite 跳转

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Nginx Rewrite 跳转

Rewrite跳转场景:

  • URL看起来更规范、合理
  • 企业会将动态URL地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上
  • 服务端某些业务调整

Rewrite 跳转实现:

  • ngx_http_rewrite_module 模块支持
  • nginx:支持URL重写、支持if条件判断,但不支持else(支持单分支if语句,不支持双分支及多分支)
  • 跳转:循环最多可以执行10次,超过后nginx将返回500错误
  • rewrite使用nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及c重定向

Rewrite 实际场景:

Nginx跳转需求的实现方式:

  • 使用rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用location匹配再跳转

rewrite放在 server{},if{},location{} 段中

  • location只对域名后边的除去传递参数外的字符串起作用

对域名或参数字符串

  • 使用if全局变量匹配
  • 使用proxy_pass 反向代理

Rewrite 命令:

Rewrite 命令语法:

  • rewrite <正则> <跳转后的内容> [flag 标记] ;

flag 标记说明:

标记

说  明

last

相当于Apache的[L]标记,表示完成rewrite

break

本条规则匹配完成即终止,不再匹配后面的任何规则

redirect

返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url

permanent

返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

last 和 break 比较:

last

break

使用场景

一般写在server和if中

一般使用在location中

URL匹配

不终止重写后的url匹配

终止重写后的url匹配

location 分类:

分类:

  • location = patt { } //精准匹配
  • location patt { } //一般匹配
  • location ~ patt { } //正则匹配

正则匹配的常用的表达式:

标记

说  明

~

执行一个正则匹配,区分大小写

~*

执行一个正则匹配,不区分大小写

!~

执行一个正则匹配,区分大小写不匹配

!~*

执行一个正则匹配,不区分大小写不匹配

^~

普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location

=

普通字符精确匹配。也就是完全匹配

@

定义一个命名的 location,使用在内部定向时

location 优先级:

  • 相同类型的表达式,字符串长的会优先匹配
  • 按优先级排列:
  1. = 类型
  2. ^~ 类型表达式
  3. 正则表达式(~和~*)类型
  4. 常规字符串匹配类型,按前缀匹配
  5. 通用匹配(/),如果没有其它匹配,任何请求都会匹配到

比较 rewrite 和 location :

  • 相同点:都能实现跳转
  • 不同点:
  1. rewrite是在同一域名内更改获取资源的路径
  2. location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
  • rewrite会写在location里,执行顺序
  1. 执行server块里面的rewrite指令
  2. 执行location匹配
  3. 执行选定的location中的rewrite指令

location 优先级规则:

匹配某个具体文件:

  • (location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location  /)

用目录做匹配访问某个文件:

  • (location = 目录) > (location ^~ 目录/) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location  /)

1基于域名的跳转

  • 公司旧域名www.kgc.com,因业务需求有变更,需要使用新域名www.newkgc.com代替
  1. 不能废除旧域名
  2. 从旧域名跳转到新域名,且保持其参数不变

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

if ($host = 'www.kgc.com')    { //添加到 location 中

    rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;

    }

[root@localhost ~]# systemctl reload nginx //重启生效

2基于客户端IP访问跳转

  • 今天公司业务版本上线,所有IP访问任何内容都显示一个固定维护页面,只有公司IP访问正常
  • 使用局域网的其它IP地址(非192.168.6.125),浏览器访问http://www.kgc.com域名和加参数请求maintenance.html页面内容,状态码是200
  • 使用http://www.kgc.com/test 带参数访问

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

set $rewrite true;

if ($remote_addr = "192.168.6.125") { //只允许 192.168.6.125 访问

    set $rewrite false;

}

if ($rewrite = true) {

    rewrite (.+) /maintenance.html; //其他网络访问则跳转到 maintenance.html 网页

}

location = /maintenance.html {

    root /usr/local/nginx/html;

}

[root@localhost ~]# echo "Website is Maintaining,Please visit later." > /usr/local/nginx/html/maintenance.html

[root@localhost ~]# systemctl reload nginx

3基于旧、新域名跳转并加目录

  • 将域名http://bbs.kgc.com下面的发帖都跳转到http://www.kgc.com/bbs,且域名跳转后保持参数不变
  • 浏览器访问 http://bbs.kgc.com/post/1.php跳转到http://www.kgc.com/bbs/post/1.php

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

server_name  bbs.kgc.com;

location /post {

     rewrite (.+) http://www.kgc.com/bbs$1 permanent;

}

4基于参数匹配的跳转

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

if ($request_uri ~ ^/100-(100|200)-(d+).html$) {

    rewrite (.*) http://www.kgc.com permanent;

}

  • 浏览器访问:

http://www.kgc.com/100-100-100.html

http://www.kgc.com/100-200-100.html

5基于最普通url请求的跳转

  • 要求:访问一个具体的页面跳转到首页
  • 验证:浏览器访问http://www.kgc.com/1/test.html跳转到首页

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

location ~* ^/1/test.html {

    rewrite (.+) http://www.kgc.com permanent;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/460507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号