nginx的rewrite使用,网址自定义更改

一、概述

本文主要讲解 rewrite 与 location

1.1 区别

  • rewrite 是在同一域名内更改获取资源的路径
  • location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器

二、常用的正则

Nginx 多处使用正则表达式,这里先把正则的几个符号说明一下

符号作用
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
.匹配除“\n”之外的任何单个字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d匹配纯数字
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
[ ]定义匹配的字符范围
[c]匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
( )表达式的开始和结束位置
|或运算符

三、location

3.1 类型

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

3.2 匹配规则

符号作用
=进行普通字符精确匹配,也就是完全匹配
^~表示普通字符匹配,前缀匹配成功后,不再继续往下匹配
~区分大小写的匹配
~*不区分大小写的匹配
!~区分大小写的匹配取反
!~*不区分大小写的匹配取反

3.3 优先级

  • 精确匹配 =:等级最高
  • 前缀匹配 ^~:次于精确匹配
  • 按文件中顺序的正则匹配 ~或~*:次于上两
  • 不带任何修饰的前缀匹配:等级低
  • / 通用匹配:等级最低,前面不符合最后才会匹配根

3.4 举列

location = / {}

=号表示精确匹配 /,匹配的这个项后面不能带有任何东西
比如 /data 、/ 、/abc,只能匹配 /

location / {}

去掉 = 号就是一般匹配,/data 、 / 、 /abc 都能被匹配到

但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

location /abc/ {}

匹配任何以 /abc/ 开头的地址,匹配符合以后,会继续往下搜索其它 location

由于优先级,其它 location后面的正则表达式没有匹配到时,才会采用这一条

location /ABC/abc {}

匹配任何以 /ABC/abc 开头的地址,匹配符合以后,继续往下搜索其它 location

location ^~ /abc/ {}

^~表示匹配成功后,不在继续往下匹配

匹配任何以 /abc/ 开头的地址,匹配符合以后,停止往下搜索,直接使用这一条

location ~* .(gif|jpg|jpeg)$ {}

  • ~* :不分大小写匹配
  • \:表示转义 . ,匹配 .gif 等结尾

匹配所有以 gif、jpg或jpeg 结尾的请求

然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

location /ABC/abc {}

最长字符匹配到 /ABC/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

location ~ /ABC/abc {}

~ 区分大小写

匹配以/ABC/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

location /ABC/abc/111.html {}

匹配/ABC/abc/111.html 文件,如果和正则 ~ /ABC/abc/111.html 相比,正则优先级更高

3.5 优先级总结

(location =) :优先级最高

(location 完整路径)

(location ^~ 路径)

(location ,* 正则顺序)

(location 部分起始路径)

(location /):优先级最低

3.6 匹配规则定义

必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页

location = / {
    proxy_pass http://tomcat_server/;
}

处理静态文件请求

有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

通用规则

用来转发带.php、.jsp后缀的动态请求到后端应用服务器

非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}

三、rewrite

3.1 概述

使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用

3.2 使用

  • rewrite 执行顺序如下

    • 执行 server 块里面的 rewrite 指令
    • 执行 location 匹配
    • 执行选定的 location 中的 rewrite 指令
  • 语法rewrite [flag];

    • regex :表示正则匹配规则
    • replacement :表示跳转后的内容
    • flag :表示 rewrite 支持的 flag 标记

flag标记说明

  • last
    • 本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中
  • break
    • 本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中
  • redirect
    • 返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent
    • 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

3.3 示例

基于域名的跳转

旧域名www.cc01.com变更使用新域名www.cc001.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

进入主配置文件修改

  • vim /usr/local/nginx/conf/nginx.conf
36     server {
 37         listen       80;
 38         server_name  www.cc01.com;						# 域名为旧域名
 39         charset utf-8;									# 万国符
 40         access_log  /var/www/html/cc01.com-access.log;	# 日志目录
 41         location / {
 42           if ($host = 'www.cc01.com'){					# $host 全局变量,代表请求主机名
 43                 rewrite ^/(.*)$ http://www.cc001.com/$1 permanent;		# $1 为正则匹配的内容,即域名后边的字符串
 44           }
 45             root   html;
 46             index  index.html index.htm;
 47         }
 48     }

设置解析

  • vim /etc/hosts
192.168.253.11 www.cc01.com www.cc001.com

访问

http://www.cc01.com/test/1.html

www.cc01.com为旧域名
/test/1.html 为网页内容

在这里插入图片描述

在这里插入图片描述

基于客户端IP访问的跳转

要求所有 IP 访问任何内容都显示一个固定维护页面,只有主 IP :192.168.253.11访问正常

修改主配置文件

  • vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.cc01.com;
        charset utf-8;
        access_log  /var/www/html/cc01.com-access.log;
		
		# 设置是否合法的IP标记
        set $rewrite true;									# 设置变量,变量值为boole值true

		# 判断是否合法
        if ($remote_addr = "192.168.253.11"){				# 当客户端为253.11时,变量值为false,不进行重写
        set $rewrite false;
            }

		# 除了合法的,其他都不合法,需要重写跳转维护页面
        if ($rewrite = true){								# 变量值为true时重写
            rewrite (.+) /weihu.html;						# 重写在访问IP后面插入/weihu.html
            }

        location = /weihu.html {							# 网页返回的是 /var/www/html目录里的weihu.html文件
            root /var/www/html;
            }
            
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

创建维护文件

  • mkdir -p /var/www/html
  • cat /var/www/html/weihu.html
    • <h1>出去</h1>
  • systemctl restart nginx

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

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

现在访问的是 http://bbs.cc01.com,需要将这个域名下面的访问都跳转到http://www.cc01.com/bbs

修改主配置文件

  • vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  bbs.cc01.com;								# 修改域名
        charset utf-8;
        access_log  /var/www/html/cc01.com-access.log;
        location /post {
            rewrite (.+) http://www.cc01.com/bbs$1 permanent;	# 这里$1代表/post
            }
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

添加网页文件

  • mkdir -p /usr/local/nginx/html/bbs/post
pwd
/usr/local/nginx/html/bbs/post
cat 1.html 
<h1>bbs 1.html</h1>

加入解析

  • vim /etc/hosts
192.168.253.11 bbs.cc01.com
  • systemctl restart nginx

测试

在这里插入图片描述

基于参数匹配的跳转

访问http://www.cc01.com/100-(100|200)-100.html 跳转到http://www.cc01.com页面

修改主配置文件

  • vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.cc01.com;
        charset utf-8;
        access_log  /var/www/html/cc01.com-access.log;

        if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {		# 设置正则条件
            rewrite (.*) http://www.cc01.com permanent;
        }

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

测试

  • systemctl restart nginx

http://www.cc01.com/100-200-100,html
在这里插入图片描述
http://www.cc01.com/100-150-100,html
在这里插入图片描述

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

要求访问 http://www.cc01.com/upload/1.php 跳转到首页

修改主配置文件

  • vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.cc01.com;
        charset utf-8;
        access_log  /var/www/html/cc01.com-access.log;
        
        location ~* /upload/.*\.php$ {						# 正则公式
        rewrite (.+) http://www.cc01.com permanent;
    }

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

测试
http://www.cc01.com/upload/1.php

在这里插入图片描述

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

访问一个具体的页面如 http://www.cc01.com/abc/123.html 跳转到首页

修改主配置文件

  • vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.cc01.com;
        charset utf-8;
        access_log  /var/www/html/cc01.com-access.log;
        
        location ~* ^/abc/123.html {
        rewrite (.+) http://www.cc01.com permanent;
    }

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

测试
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值