Nginx服务重写功能

一、重写功能
1、重写功能作用
重写功能(rewrite)用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。

2、rewrite指令
①if指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断可以在server模块和location模块,不支持使用if else或者if elif这样的多重判断,用法如下:

if ( [连接符] 条件匹配 ){

执行动作;

}

条件匹配连接符:

= 比较变量和字符串是否相等,相等为true。

!= 比较变量和字符串是否不相等,不相等为true。

~ 区分大小写,判断字符是否匹配,匹配为true。

~* 不区分大小写,判断字符是否匹配,匹配为true。

-f 和 !-f #判断请求的文件是否存在和是否不存在。

-d 和 !-d #判断请求的目录是否存在和是否不存在。

-x 和 !-x #判断文件是否可执行和是否不可执行。

-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接) 。

举例:
location /main {
     index index.html;
     default_type text/html;
#定义文件类型
     if ( $scheme = http ){
#如果用户访问的协议是http,$scheme变量表示用户来访问使用的协议。       
    echo "if-----> $scheme";
#则输出if --->协议 
    }
     if ( $scheme = https ){
#如果用户访问的协议是https,$scheme变量表示用户来访问使用的协议。 
      echo "if ----> $scheme";
#则输出if --->协议 
   }

  

②return指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置。

使用格式:

return code :返回状态码

return code [text]:返回状态码可以选择性加一个文本

return code url :返回某个状态码直接跳转到某个url

举例:访问/test文件直接返回403报错
server {
#server模块
        listen 80;
#监听所有80端口
        server_name www.kgc.com;
#虚拟主机www.kgc.com        
        root /data/nginx/pc;
#定义根目录位置
        location /test{
        return 403;
#location模块访问根下的/test即返回403错误
}
}

  

 

 

③ set指令

设置变量,例如set $name kgc 设置name变量值为kgc。

location /main {
   root /data/nginx/html/pc;
   index index.html;
   default_type text/html;
    set $name kgc;
#定义变量name的值为kgc
    return $name;
#返回name变量的值   
}

  

④break指令

只跳出 rewrite中的(if , set ,return)指令,其他不跳出,如server模块内的不跳出。

location /main {
   root /data/nginx/html/pc;
   index index.html;
   default_type text/html;
    set $name kgc;
#定义name变量为kgc
    return $name;
#返回name变量值
   break; 
#location块中break后面指令还会执行,只会跳过rewrite中4个指令的内容,其他内容继续执行
    set $my_port $server_port;
    echo $my_port;
#输出为空,因为跳过了set指令的执行内容。echo命令需要安装第三方模块
 }

  

二、rewrite标志
格式: rewrite 客户输入的(可用原始url正则表示) 你想让客户访问的 (可用url正则表示) 标志(即动作)

. 表示任意字符

\d 表示匹配数字

* 表示任意长度字符包括0次

.* 表示任意长度字符不包括0次

①redirect标志
redirect 等于302即临时重定向,不会在浏览器中缓存。

②permanent标志
permanent 等于301即永久重定向,会在浏览器中缓存。

③break标志
break标志会重定向,但是不会显示跳转后的域名,只显示用户输入的域名。

④last标志
last标志,重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用。

⑤rewrite标志实验
1、首先在主配置文件中创建2个虚拟主机,www.bj.com和www.beijing.com并且使用rewrite指令使得访问www.bj.com时跳转到www.beijing.com。

redirect、permanent实例,访问www.bj.com跳转到www.beijing.com
配置文件中添加:
server {
        listen 80;
#监听80端口
        server_name www.bj.com;
#虚拟主机www.bj.com
        root /data/nginx/bj;
#虚拟主机1根目录
        location / {
        root /data/nginx/bj;
#虚拟主机1根目录
        rewrite /  http://www.beijing.com  permanent;
#访问虚拟主机1 www.bj.com时使用rewrite永久重定向到www.beijing.com。注意此处协议写全
}
 
}
server {
        listen 80;
#监听80端口
        server_name www.beijing.com;
#虚拟主机2 www.beijing.com
        root /data/nginx/beijing;
#虚拟主机2根目录
}
nging -t
#检查配置文件是否有错误
nginx  -s reload
#热加载nginx配置文件

  

2、创建虚拟主机1和虚拟主机2的根目录并在虚拟主机1即www.bj.com的index.html中写入内容“this  is  bj”在虚拟主机2的根目录即www.beijing.com的index.html中写入内容“this is bj jump beijing” 

mkdir -p /data/nginx/bj
#创建www.bj.com的根目录
mkdir -p /data/nginx/beijing
#创建www.beijing.com的根目录
echo "this is bj">/data/nginx/bj/index.html
#将this is bj 写入www.bj.com的根目录文件index.html中
echo "this is bj  jump beijing">/data/nginx/beijing/index.html
#将this is bj  jump  beijing 写入www.beijing.com的根目录文件index.html中

  

3、使用另外一台机器在/etc/hosts中添加本机ip对应www.bj.com和www.beijing.com。然后使用curl访问查看是否为302永久重定向提示,然后使用curl 域名  -L,查看跳转后的网页内容。

vim /etc/hosts
#编辑hosts文件
#添加内容:
192.168.30.11  www.bj.com  www.beijing.com
#此处ip为自己ip

  

 

 

4、redirect临时重定向和break使用只需要将配置文件中的permanent改为对应标志即可。 

 

 

posted @ 2023-03-20 10:59  twistfate123  阅读(81)  评论(0编辑  收藏  举报