概述

rewrite可以实现域名跳转(重定向)、URL重写(伪静态)、动静分离(跳转域名,并接入CDN实现加速,适合小站点)。

  1. 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。

  2. 伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。
    从URL结构以及页面名称看,伪静态和静态页面是一样的。伪静态的页面后缀可以是html htm 或者是目录格式;
    伪静态只是改变了URL的表现形式,实际上还是动态页面;
    静态页面可以节省服务器资源,伪静态本质上还是动态页面,所以消耗资源是和动态页面一样的,而且因为Rewrite服务器还需要消耗额外的资源。

  3. 动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

if语句

nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return
如要将匹配内容大写小写都匹配,可在~后加*号;

nginx的rewrite配置, if, break, last, return
-f判断是否存在
nginx的rewrite配置, if, break, last, return

rewrite中的break和last

nginx的rewrite配置, if, break, last, return

添加rewrite_log on可记录rewrite的详细过程在error_log里边(error_log 级别需要是notice);
error_log /var/log/nginx/error.log notice; (/etc/nginx/nginx.conf)

上面语句的rewrite情况:
nginx的rewrite配置, if, break, last, return

  • 使用break让rewrite结束
    nginx的rewrite配置, if, break, last, return
    上面语句的rewrite情况:
    nginx的rewrite配置, if, break, last, return
    把break改成last跟上面的例子的效果是一样的;
    break跟last使用location时效果会不一样;

  • 多重rewrite
    nginx的rewrite配置, if, break, last, return
    注意:变成 b.html后,再被location /匹配,所以实施location /里面的语句,是否有/1.html或/2.html实施改写,两者都不符合;
    nginx的rewrite配置, if, break, last, return

  • location中使用break;
    nginx的rewrite配置, if, break, last, return
    break后结束;
    nginx的rewrite配置, if, break, last, return

  • location中使用last
    nginx的rewrite配置, if, break, last, return

访问/1.html,匹配/,改写成/2.html,接着last中断语句,但以链接/2.html会再从上到下走一次,第二次走的时候可以匹配/和/2.html,/2.html匹配更精准,所以实施改写成/a.html,然后再走第三次,都不匹配,直接访问/a.html;nginx的rewrite配置, if, break, last, return

return

nginx的rewrite配置, if, break, last, return

  • return可以直接使用在server {} 段里;
    nginx的rewrite配置, if, break, last, return
    return 403;这一行跟deny all;是一样的;

  • return使用在if 段里;

nginx的rewrite配置, if, break, last, return
匹配到.htpasswd返回404;
nginx的rewrite配置, if, break, last, return

  • return 字符串;
    nginx的rewrite配置, if, break, last, return
    要指定状态码为200;
    nginx的rewrite配置, if, break, last, return

  • return 变量

nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return

  • return html代码
    nginx的rewrite配置, if, break, last, return

跳到$host$request_uri根据要访问的域名和uri跳转;
nginx的rewrite配置, if, break, last, return
nginx的rewrite配置, if, break, last, return
使用跳转到html代码,让网站访问正常而不会跳转到**网站

  • return 链接,类似rewrite;
    nginx的rewrite配置, if, break, last, return
    nginx的rewrite配置, if, break, last, return

网址前加状态码301也可以,就变成301; 如果改成200,变成翻回字符串;
nginx的rewrite配置, if, break, last, return

nginx的rewrite配置, if, break, last, return

rewrite规则

nginx的rewrite配置, if, break, last, return

  • 域名重定向的两种写法
    nginx的rewrite配置, if, break, last, return
  • 连续循环和解决
    nginx的rewrite配置, if, break, last, return

示例4是想实现,访问这个域名的目录跳到/123.com/abc目录下(不跳转是访问/123.com目录),但是以上语句会造成连续循环;
curl -L 可以展示每一次重定向,最多50次;

nginx的rewrite配置, if, break, last, return

  • 使用break解决

nginx的rewrite配置, if, break, last, return
这个情况下访问不带/abc的链接如/1.html,会转到/abc/1.html,符合业务逻辑,但是如果有人访问/abc/1.html,会访问到/abc/abc/1.html,不符合业务逻辑。

  • 使用if 语句解决

nginx的rewrite配置, if, break, last, return
不带目录,跳转到/abc下;
nginx的rewrite配置, if, break, last, return
带/abc链接,不再跳转;
nginx的rewrite配置, if, break, last, return

相关文章: