一、 说明
rewrite地址可以实现地址重写,简单的用法就是伪静态网页,Nginx的rewrite规则需要pcre软件的支持,即通过Perl兼职正则表达式对语法进行规则匹配

  1. rewrite语法
    rewrite regex replacement [flag]
    解释:rewrite指令匹配regex处的正则表达式,匹配成功后跳转到replacement处的网页,最后flag是标记

    rewrite ^/(.*) http://www.etiantian.org/$1 permanent
    解释:此处的正则表达式表示匹配所有,匹配成功后跳转到etiantian.org这个网页上。$1是后向引用正则表达式括号里面的内容,并用permanent做标记为永久301重定向

  2. regex常用正则表达式

\   将后面的字符标记为一个特殊字符、原意字符、后向引用
        如\n匹配换行符,\$匹配$
^   匹配输入字符串的起始位置
$   匹配输入字符串的结束位置
*   匹配前面的字符零次或多次
+   匹配前面的字符一次或多次
?   匹配前面的字符零次或一次
.   匹配除\n之外的任何单个字符
(pattern)   匹配括号内的表达式,常用来做后向引用
  1. rewrite指令flag标记说明
    last        本条规则匹配完成后,继续向下匹配新的location URI规则。
    break       本条规则匹配完成后终止,不再向后匹配规则。
    redirect    返回302临时重定向。
    permanent   返回301永久重定向。

说明:

lastbreak实现url重写,浏览器显示的地址不变,服务器端访问的程序和路径发生了变化
redirect和permanent实现url跳转,浏览器显示的地址是跳转后的地址
使用别名alias时,要使用last标记,。
使用proxy_pass时,要使用break标记
在根location(即location/{......})中或server{......}标签中,编写rewrite规则,建议使用last标记
在普通的loaction(如location/oldboy/{......}或if{ })中编写rewrite规则,则建议使用break标记
  1. rewirt在企业中的应用场景

    1)可以跳转用户浏览的url,使其看起来更规范,符合开发及产品人员的需求
    2)为了让搜索引擎搜录网站的内容,将动态url地址伪装成静态地址
    3)网站换新域名后,将旧域名的访问跳转到新域名上
    4)根据特殊变量、目录、客户端的信息进行url跳转

二、 企业案例

  1. 需求
    要求访etiantian.org时,跳转到www.etiantian.org

  2. 错误配置[很常见]
    配置

    [root@xxx ~]# cat bbs.conf 
    server {
      listen       80;
      server_name  www.etiantian.org bbs.org;
      rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
      root   html/bbs;
      index  index.html index.htm;
    }

    访问测试

[root@xxx ~]# curl -L etiantian.org 
 curl: (47) Maximum (50) redirects followed

显示最多跳转50次,已经跳转了47次,放弃跳转
说明进入了无限循环状态
2) 错误原因

[root@xxx ~]# curl -Lv etiantian.org

#显示循环过程,显示内容略,可以从显示内容中,看出无限循环
原因分析:
第一次访问etiantia.org后,并要求跳转至www.etiantian.org
第二次用www.etiantian.org访问,不管前面是什么域名,再次匹配跳转规则,被要求再次跳转,所以进入了无限循环

  1. 正确配置
    方法1:使用2个虚拟服务器
    [root@xxx ~]# cat www.conf
     server {
         listen       80;
         server_name etiantian.omg;
         rewrite ^/(.*) www.etiantian.omg/$1 permanent;
     }
     server {
         listen       80;
         server_name www.etiantian.omg;
         location / {
             root   html/www;
             index  index.html index.htm;
         }
    输入etiantian.omg网址后,会永久重定向到www.etiantian.omg网址,且地址栏显示跳转后的地址
    2) 方法2:用if语句判断后,再进行地址重写
[root@xxx ~]# cat bbs.conf 
server {
    listen       80;
    server_name  bbs.etiantian.org bbs.org;
    if ($host ~* "^etiantian.org$") {
       rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
    }
    root   html/bbs;
    index  index.html index.htm;
}
文档更新时间: 2023-08-10 06:21   作者:月影鹏鹏
IT运维支持-AIWALY-月影工作室