微信扫一扫 分享朋友圈

已有 3960 人浏览分享

开启左侧

nginx rewrite功能使用介绍

[复制链接]
3960 0
rewrite简介
    rewrite是Nginx服务器提供的一个重要基本功能,主要作用用来实现URL地址重写
rewrite功能实现依赖于pcre的支持,因此在编译安装Nginx服务器之前,需安装pcre库(nginx使用ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置)
在真正了解rewrite的使用之前,有必要全面系统学习下rewrite相关的指令和语法使用,下面来逐一了解下吧
Rewrite规则与指令
set指令
    该指令用来设置一个新的变量。
  variable,变量名,该变量名要用"$"作为变量的第一个字符,且不能与Nginx服务器预设的全局变量同名;
    value:变量值,可以是字符串、其他变量或者变量的组合等;

一个简单的案例

  1. server {
  2.     listen 8081;
  3.     server_name localhsot;
  4.     location /server {
  5.             set $name zhangsan;
  6.             set $age 19;
  7.             default_type text/plain;
  8.             return 200 $name=$age;
  9.     }
  10. }

复制代码
重启nginx服务,然后浏览器访问观察下效果
image.png
下面列举了Rewrite常用全局变量
这些变量可以在使用过程中结合自身的业务灵活选择使用
image.png
我们来随机测试下几个指令的使用吧


  1. server {
  2.     listen 8081;
  3.     server_name localhsot;
  4.     location /server {
  5.             set $name zhangsan;
  6.             set $age 19;
  7.             default_type text/plain;
  8.             return 200 $name=$age=$args;
  9.     }
  10. }
复制代码
image.png
$http_user_agent
image.png
image.png
其他的指令有兴趣的同学可以自行尝试,下面使用这些指令完成一个需求
    自定义日志输出格式,将请求的日志输出到自定义的日志中
具体配置如下:

  1. log_format main '$remote_addr - $request - $status - $request_uri - $http_user_agent';

  2.    server {
  3.         listen 8081;
  4.         server_name localhsot;
  5.         location /server {
  6.                 access_log logs/access-server.log main;
  7.                 set $name zhangsan;
  8.                 set $age 19;
  9.                 default_type text/plain;
  10.                 return 200 $name=$age=$args=$http_user_agent;
  11.         }
  12.     }

复制代码
通过这种方式,就可以实现自定义请求的相关参数输出到自定义的日志文件中
image.png
if指令
    该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置

  1. location /testif {
  2.                 set $username 'zhangsan';
  3.                 default_type text/plain;
  4.                 if ($username){
  5.                         return 200 success;
  6.                 }
  7.                 return 200 'params is empty';
  8. }
复制代码
image.png
2) 使用"=“和”!="比较变量和字符串是否相等,满足为true,不满足为false
  1. if ($request_method = POST) {
  2. return 405; 3
  3. }
复制代码
注意:此处和Java不一样的是字符串不需加引号

3)使用正则表达式对变量匹配
    匹配成功返回true,否则返回false;
    变量与正则表达式之间使用"“,”“,”!“,”!"来连接;
    “~” 代表匹配正则表达式过程中区分大小写;
    "~*"代表匹配正则表达式过程中不区分大小写;
    "!“和”!*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true;

  1. if ($http_user_agent ~ MSIE) {
  2.     #$http_user_agent的值中是否包含MSIE字符串,如果包含返回 true
  3. }
复制代码
注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}“或者是”;"等字符时,就需要把引号加上
  1. if ($http_user_agent ~ Safari){
  2.                         return 200 Chrome;
  3.   }
复制代码
image.png
4)判断请求文件是否存在使用"-f"和"!-f"
    当使用"-f"时,如果请求的文件存在返回true,不存在返回false;
    当使用"!f"时,如果请求文件不存在,但该文件所在目录存在返回true,文件和目录都不存在返回false,如果文件存在返回false;

  1. if (-f $request_filename){
  2.     #判断请求的文件是否存在
  3. }

  4. if (!-f $request_filename){
  5.     #判断请求的文件是否不存在
  6. }
复制代码
案例展示
  1. location /file {
  2.                 root html;
  3.                 default_type text/html;
  4.                 if (!-f $request_filename){
  5.                         return 200 '<h1>not find file</h1>';
  6.                 }
  7.         }
复制代码
当访问目录下不存在的文件时,将会看到如下的异常返回
image.png
5) 判断请求的目录是否存在使用"-d"和"!-d"
    当使用"-d"时,如果请求的目录存在,if返回true,如果目录不存在则返回false;
    当使用"!-d"时,如果请求的目录不存在但该目录的上级目录存在则返回true,该目录和它上级目录都不存在则返回false,如果请求目录存在也返回false;

6) 判断请求的目录或者文件是否存在使用"-e"和"!-e"
    当使用"-e",如果请求的目录或者文件存在时,if返回true,否则返回false;
    当使用"!-e",如果请求的文件和文件所在路径上的目录都不存在返回true,否则返回false;

7) 判断请求的文件是否可执行使用"-x"和"!-x"
    当使用"-x",如果请求的文件可执行,if返回true,否则返回false;
    当使用"!-x",如果请求文件不可执行,返回true,否则返回false;

break指令
    该指令用于中断当前相同作用域中的其他Nginx配置。与该指令处于同一作用域的Nginx配置中,位于它前面的指令配置生效,位于后面的指令配置无效

image.png
  1. location /{
  2.     if ($param){

  3.         set $id $1;
  4.         break;
  5.         limit_rate 10k;
  6.     }
  7. }
复制代码
  1. location /break {
  2.                 default_type text/plain;
  3.                 set $username MIKE;
  4.                 if ($args){
  5.                         set $username JIM;
  6.                         break;
  7.                         set $username JODAN;
  8.                 }
  9.                 return 200 $username;
  10.         }

复制代码
image.png
return指令
    该指令用于完成对请求的处理,直接向客户端返回响应状态代码。在return后的所有Nginx配置都是无效的

image.png
code,为返回给客户端的HTTP状态代理。可以返回的状态代码为0~999的任意HTTP状态代理;
    text:为返回给客户端的响应体内容,支持变量的使用;
    URL:为返回给客户端的URL地址;

  1. location /return {
  2.                 default_type application/json;
  3.                 return 200 '{id:1,name:jike}';
  4.         }
复制代码
image.png
rewrite指令
    该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理
URL和URI的区别
    URI:统一资源标识符
    URL:统一资源定位符

image.png
regex,用来匹配URI的正则表达式;
    replacement:匹配成功后,用于替换URI中被截取内容的字符串。如果该字符串是以"http://"或者"https://"开头的,则不会继续向下对URI进行其他处理,而是直接返回重写后的URI给客户端;
    flag:用来设置rewrite对URI的处理行为,可选值有如下

    last break redirect permanent
last : 终止继续在本location中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。该标志将重写的URI重写在server块中执行,为重写后的URI提供了转入到其他location块的机会;
break : 将此处重写的URI作为一个新的URI,在本块中继续处理,该标志重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块;
redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;
redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;
permanent : 将重写后的URI返回给客户端,状态码为301,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;

示例1

  1. location /rewirte {
  2.                 rewrite ^/rewrite/url\w*$ https://www.baidu.com;
  3.                 rewrite ^/rewrite/(test)/\w*$ /$1;
  4.                 rewrite ^/rewrite/(hello)/\w*$ /$1;
  5.         }

  6.         location /test {
  7.                 default_type text/plain;
  8.                 return 200 "hello success";
  9.         }

复制代码
  1. location /rewirte {
  2.                 rewrite ^/rewrite/url\w*$ https://www.baidu.com;
  3.                 rewrite ^/rewrite/(test)/\w*$ /$1 last;
  4.                 rewrite ^/rewrite/(hello)/\w*$ /$1 last;
  5.         }

  6.         location /test {
  7.                 default_type text/plain;
  8.                 return 200 "hello success";
  9.         }
复制代码
rewrite_log指令
    该指令配置是否开启URL重写日志的输出功能

image.png
开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总
  1. location /rewirte {
  2.                                 rewrite_log on;
  3.                                 error_log logs/error.log notice;
  4.                 rewrite ^/rewrite/url\w*$ https://www.baidu.com;
  5.                 rewrite ^/rewrite/(test)/\w*$ /$1 last;
  6.                 rewrite ^/rewrite/(hello)/\w*$ /$1 last;
  7.         }
复制代码
一、rewrite配置域名跳转
有很多大型网站,在起步的时候,比如域名为 : www.haoyijia.com,但是域名太长所带来的问题就是不方便记忆,于是后面改成 www.hyj.com,问题是,一些老用户之前一直习惯了那个长域名,如何在老用户输入长域名的时候仍然可以跳转到新的短域名上呢?就可以考虑使用rewrite的功能;下面在本地做一下模拟。
配置步骤:

1、准备两个域名
这里我直接在本地模拟2个域名,通过在本地的hosts文件配置下就可以了

image.png
2、配置nginx.conf文件
  1. server {

  2.                 listen 80;
  3.                 server_name www.zcy.com www.zhangcongyi.com;
  4.                 rewrite ^/ http://www.jd.com permanent;
  5.         }
复制代码
重启nginx服务,浏览器访问:www.zcy.com 或者www.zhangcongyi.com,观察效果
image.png
image.png
image.png
image.png
二、rewrite配置独立域名
一个完整的项目包含多个模块,比如购物网站有商品商品搜索模块、商品详情模块、购物车模块等,那么我们如何为每一个模块设置独立的域名。

  1. server{
  2.                 listen 80;
  3.                 server_name search.hm.com;
  4.                 rewrite ^(.*) http://www.hm.com/bbs$1 last;
  5.         }

  6.         server{
  7.                 listen 81;
  8.                 server_name item.hm.com;
  9.                 rewrite ^(.*) http://www.hm.com/item$1 last;
  10.         }

  11.         server{
  12.                 listen 82;
  13.                 server_name cart.hm.com;
  14.                 rewrite ^(.*) http://www.hm.com/cart$1 last;
  15.         }

复制代码
本地的hosts文件添加如下配置
image.png
重启nginx服务,可以在浏览器访问下观察效果如何
image.png
二、rewrite配置目录合并
搜索引擎优化(SEO)是一种利用搜索引擎的搜索规则,来提供目的网站的有关搜索引擎内排名的方式;
我们在创建自己的站点时,可以通过很多种方式有效提供搜索引擎优化的程度,其中有一项就包含URL的目录层级一般不要超过三层,否则的话不利于搜索引擎的搜索也给客户端的输入带来了负担;
但是将所有的文件放在一个目录下又会导致文件资源管理混乱,并且访问文件的速度也会随着文件增多而慢下来,这两个问题是相互矛盾的,使用rewrite就可以解决上述问题;
举例,网站中有一个资源文件的访问路径时,比如访问:/server/11/22/33/44/20.html,也就是说20.html存在于第5级目录下,如果想要访问该资源文件,客户端的URL地址就要写成http://www.web.name/server/11/22/33/44/20.html;

  1. server {
  2.         listen 80;
  3.         server_name www.web.com;
  4.         location /server{
  5.                 root html;
  6.         }
  7. }
复制代码
image.png
image.png
但是这个是非常不利于SEO搜索引擎优化的,同时客户端也不好记,使用rewrite我们可以进行如下配置:
  1. server {
  2.         listen 80;
  3.         server_name www.web.com;
  4.         location /server{
  5.                 rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last;
  6.         }
  7. }
复制代码


免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

26

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2024-10-6 03:05 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。