炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)

Posted 遙遙背影暖暖流星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)相关的知识,希望对你有一定的参考价值。

前言

在生产实际中,当用户页面请求后,很多是需要自动跳转到其他特定页面,这个时候往往可以利用nginx配置中location规则或rewrite语法进行设置。

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
rewrite只能放在server{},location{},if{}中,
并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置

一、Rewrite

1、Rewrite跳转场景

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名上

服务端某些业务调整

常用实景:

Nginx跳转需求的实现方式
使用 rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用 location匹配再跳转
rewrite放在 server{},if{}, location{} 段中
对域名或参数字符串
使用if全局变量匹配
使用 proxy_pass反向代理

2、nginx的正则表达式

在这里插入图片描述

二,rewrite 命令

1、语法

rewrite    <regex>             <replacement>                  [flag];
            正则                跳转后的内容                rewrite支持的flag标记
 

2、标记说法


last                  相当于Apache的[L]标记,表示完成rewrite
break                 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect              返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent            返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

3 、last和break有什么不同

在这里插入图片描述

三、location

1、location语法规则

语法规则: location [=||*|^~] /uri/ {… }

2、分类

location = patt {} [精准匹配]

location ~ patt {} [正则匹配]

location patt {} [一般匹配 ]

匹配顺序,精确匹配>正则匹配>普通匹配
当匹配成功时停止匹配,按当前匹配的规则处理请求

3、 location的规则优先顺序

在这里插入图片描述

location = / {
          #规则A
      }
      location = /login {
          #规则B
      }
      location ^~ /static/ {
          #规则C
      }
      location ~ \\.(gif|jpg|png|js|css)$ {
          #规则D
      }
      location ~* \\.png$ {
          #规则E
      }
      location !~ \\.xhtml$ {
          #规则F
      }
      location !~* \\.xhtml$ {
          #规则G
      }
      location / {
          #规则H
      }

那么产生的效果如下:

  1. 访问根目录/,比如http://localhost/将匹配规则A
  2. 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
  3. 访问 http://localhost/static/a.html 将匹配规则C
  4. 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
  5. 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
  6. 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
  7. 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

匹配某个具体文件
( location = 完整路径)>( location ^~ 完整路径)>( location ~* 完整路径)>( location ~ 完整路径)>( location完整路径)>( location /)
用目录做匹配访问某个文件
( location = 目录)>( location ^~ 目录)>( location ~ 目录)>
( location ~* 目录)>( location 目录)>( location /)

4、rewrite和 location有什么不同?

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

四,实际应用

1、基于域名跳转

情景:当访问就域名www.cat.com时自动跳转到新域名www.dog.com
实验环境:nginx为新安装,纯净模式即可
步骤:
echo “192.168.100.7 www.cat.com www.dog.com” >> /etc/hosts #添加映射
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak #设置配置文件时养成先备份的习惯
mkdir -p /var/log/nginx #创建日志目录

vim /usr/local/nginx/conf/nginx.conf

 server {
        listen       80;
        server_name  www.cat.com;                  #旧域名

        #charset koi8-r;

        access_log  /var/log/nginx/www.cat.com-access.log ;    #日志位置

        location / {
            if ($host = 'www.cat.com'){         ##$host为rewrite全局变量,代表请求主机头字段或主机名,注意=两边有空格哦
            rewrite ^/(.*)$ http://www.dog.com/$1 permanent;      #跳转新域名
}
            root   html;
            index  index.html index.htm;
        }

在这里插入图片描述
在这里插入图片描述

2、基于不同IP地址的跳转

情景:今天公司业务新版本上线,要求所有IP 访问任何内容都显示一个固定维护页面,只有公司IP 192.168.100.7访问正常。
步骤:
恢复原来的设置 cp /usr/local/nginx/conf/nginx.conf b.ak /usr/local/nginx/conf/nginx.conf

vim /usr/local/nginx/conf/nginx.conf

 server {
        listen       80;
        server_name  www.cat.com;

        #charset koi8-r;

        access_log  /var/log/nginx/www.cat.com-access.log ;
        set $rewrite true;
        if ($remote_addr = "192.168.100.7"){
                set $rewrite false;
}
        if ($rewrite = true){
                rewrite (.+) /weihu.html;
}
        location = /weihu.html {
            root   html;
            index  index.html index.htm;
        }


nginx -t
systemctl restart nginx.service

在这里插入图片描述

在这里插入图片描述
除了192.168.100.7主机能正常登录,其他的主机无法访问

3、基于旧域名跳转到新域名后面加目录

需求:当访问的是 http://www.cat.com/post/1.html,将这个域名下面的访问都跳转到 http://www.dog.com/bbs/post/1.html下
(即/post/1.html保持一致,但跳转新页面后要变成/bbs/psot/1.html)
echo “192.168.100.7 www.cat.com www.dog.com” >> /etc/hosts #添加映射

mkdir -p /usr/local/nginx/html/bbs/post

 echo "<h1> this is 1.html </h1>" >> /usr/local/nginx/html/bbs/post/1.html

vim /usr/local/nginx/conf/nginx.conf

server {
listen       80;
server_name  www.cat.com;

 #charset koi8-r;
 
access_log  /var/log/nginx/www.dog.com-access.log;             #修改日志
location /post {
rewrite (.*) http://www.dog.com/bbs$1 permanent; #这里$1为位置变量,代表/post
  }
 
location / {
root   html;
index  index.html index.htm;
}

nginx -t
systemctl restart nginx.service

验证登录 http://www.cat.com/post/1.html,会自动跳转http://www.dog.com/bbs/post/1.html

在这里插入图片描述
在这里插入图片描述

4、基于参数匹配(多余)的跳转

需求:访问http://www.cat.com/100-(100|200) -100.html会跳转到 http://www .dog.com的页面

vim /usr/local/nginx/conf/nginx.conf


server {
listen  80;
server_name    www.cat.com;                                   #修改域名
#charset koi8-r;
access_log/var/log/nginx/www.cat.com-access.log;              #日志
if ($request_uri ~ ^/100-(100|200)-(\\d+)\\.html$) {          # $request_uri内置变量,表示URI,\\d纯数字
#设置正则匹配,示例: http:// www.cat.com/100-100-1231.html
rewrite (.* ) http://www.dog.com permanent;                   # 设置重写
}
location / {
root html;
index index.html index .htm;
}

nginx -t
systemctl restart nginx.service

这个登录www.cat.com/100-100-100.html
在这里插入图片描述

5、基于目录下所有php结尾的文件跳转

要求:访http://www.cat.com/upload/123.php 跳转到首页www,dog.com
(也就是登录/upload/****/php时,自动跳转)

vim /usr/local/nginx/conf/nginx.conf

server {
listen       80;
server_name  www.cat.com;
 
 #charset koi8-r;
 
access_log  /var/log/nginx/www.dog.com-access.log;
location ~* /upload/.*\\.php$ {
rewrite (.+) http://www.dog.com  permanent;
 }

location / {
root   html;
index  index.html index.htm;
 }

nginx -t
systemctl restart nginx.service

登录http://www.cat.com/upload/123.php ,自动跳转
在这里插入图片描述

6、基于最普通一条url请求的跳转

要求:要求访问一个具体的子页面,如:http: / / www.cat.com/abc/123.html,跳转到首页

vim /usr/local/nginx/conf/nginx.conf

    server {
        listen       80;
        server_name  www.cat.com;

        #charset koi8-r;

        access_log  /var/log/nginx/www.cat.com-access.log;

        location ~* /abc/123.html {
        rewrite (.+) http://www.cat.com permanent;


  }
        location  /  {

            root   html;
            index  index.html index.htm;
        }

nginx -t
systemctl restart nginx.service

登录www.cat.com/abc/123.html
在这里插入图片描述
自动跳转

以上是关于炎炎夏日,深夜详谈nginx的配置中location和rewrite的语法规则(从入门到高手的第六步)的主要内容,如果未能解决你的问题,请参考以下文章

炎炎夏日,快用代码下场雨ヽ`☂ヽ`canvas

炎炎夏日,快用代码下场雨ヽ`☂ヽ`canvas

6岁男孩向他们敬礼2分钟,夏日炎炎,你们都辛苦了!

6岁男孩向他们敬礼2分钟,夏日炎炎,你们都辛苦了!

字节跳动Java实习四面凉经..炎炎夏日的一丝清凉..为鸿星尔克点赞!

Nginx应⽤场景之反向代理