234cfds1 发表于 2018-11-13 11:10:33

Nginx (五)——Rewrite 语法介绍

  一、rewrite模块介绍(Nginx_http_rewrite_module)
  nginx通过ngx_http_rewriet_module模块支持url重写、支持if条件判断,但不支持else。另外该模块需要PCRE支持,应该在编译nginx时指定PCRE支持。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可执行10次,超过后Nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下是有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。学习rewrite之前要对正则表达式很熟悉,以下列出一些常用的正则表达式元字符:
  .:匹配除换行符以外的任意字符。
  ?:重复0次或1次
  + :重复1次或更多次
  *:重复0次或更多次
  \d:匹配数字
  ^ :   匹配字符串的开始字符
  $ : 匹配字符串的结束字符
  {n}:重复n次
  {n,}:重复n次或更多次
   :匹配单个字符c
  :匹配a-z小写字母的任意一个
  二、rewrite 重写中用到的指令
  if(条件){}设定条件,再进行重写
  set# 设置变量
  return # 返回状态码
  break # 跳出rewrite
  rewrite # 重写
  三、指令介绍及实验测试
  1.if 语法格式
  if 空格 (条件){
  重写模式
  }
  条件怎么写?
  答:3种写法
  1:“=”来判断相等,用于字符串比较
  2: “~”用正则来匹配(此处的正则区分大小写)
  “~*”不区分大小写的正则
  3:   -f -d -e来判断是否为文件,为目录,是否存在
  例子1:使用if 语句,禁止IP地址访问
  location / {
  if ($remote_addr = 192.168.40.1) {
  return 403;
  }
  if ($http_user_agent ~ rv:11.0) {
  rewrite ^.*$ /ie.html;
  break;      #(不break会循环重定向)
  }
  if (!-e $document_root$fastcgi_script_name) {
  rewrite ^.*s /404.html break;
  }
  注:此处还要加break,
  以xx.com/dsafsd.html这个不存在的页面为例,
  因为我们观察访问日志,日志中显示的访问路径,依然是GET/dsafsd.html HTP/1.1
  提示:服务器内部的rewrite和302跳转不一样。
  跳转的话URL都变了,变成了重新http请求404.html,而内部rewrite,上下文没变,
  就是说 fastcgi_script_name 仍然是dsafsd.html,因此,会循环重定向。
  四、set用法
  set是设置变量用的,可以用来达到多条件判断时作标志用。
  达到Apache下的rewrite_condition的效果。
  如果:判断IE并重写,且不用break:
  if ($http_user_agent ~* rv:11.0) {
  set $isie 1;
  }
  if ($fastcgi_script_name = ie.html) {
  set $isie 0;
  }
  if ($isie = 1) {
  rewrite ^.*$ ie.html;
  }

页: [1]
查看完整版本: Nginx (五)——Rewrite 语法介绍