设为首页 收藏本站
查看: 733|回复: 0

[经验分享] nginx中rewrite用法

[复制链接]

尚未签到

发表于 2018-11-8 06:26:19 | 显示全部楼层 |阅读模式
  nginx中rewrite用法
一、rewrite规则
  rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
  rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如http://seanlook.com/a/we/index.PHP?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];
  如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。
二、rewrite与location区别及执行过程
  表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
  1、执行server块的rewrite指令
  2、执行location匹配
  3、执行选定的location中的rewrite指令
  提示:如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
三、rewrite语法格式及参数说明
1、rewrite语法格式
  rewrite语法格式:rewrite regex replacement [flag];
  rewrite
  
  
  [flag];
  关键字
  正则
  替代内容
  flag标记
  flag标记说明:
  last  #本条规则匹配完成后,继续向下匹配新的location URI规则
  break  #本条规则匹配完成即终止,不再匹配后面的任何规则
  redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址
  permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
  例1:rewrite ^/(.*) http://www.test.com/$1 permanent;
  例1说明:
  rewrite为固定关键字,表示开始进行rewrite匹配规则
  regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址
  replacement部分是http://www.test.com/$1,$1是取自regex部分()里的内容。匹配成功后跳转到的URL。
  flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.test.com/$1 地址上
2、rewrite 常用正则表达式说明
  字符
  描述
  .
  匹配除换行符以外的任意字符
  ?
  匹配前面的字符零次或一次
  +
  匹配前面的字符一次或多次
  *
  匹配前面的字符0次或多次
  \d
  匹配一个数字字符。等价于[0-9]
  \
  将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
  ^
  匹配字符串的开始
  $
  匹配字符串的结尾
  {n}
  匹配前面的字符n次
  {n,}
  匹配前面的字符n次或更多次
  [c]
  匹配单个字符c
  [a-z]
  匹配a-z小写字母的任意一个
  小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
3、if指令和可使用的全局变量
(1)if判断指令语法
  if ( 条件判断 )
  { rewrite ... }
  对给定的条件进行判断。如果为真,大括号内的rewrite指令将被执行,if条件可以是如下任何内容:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
  =或!=
  直接比较变量和内容
  ~
  区分大小写正则表达式匹配
  ~*
  不区分大小写的正则表达式匹配
  !~
  区分大小写的正则表达式不匹配
  -f和!-f
  用来判断文件是否存在
  -d和!-d
  用来判断目录是否存在
  -e和!-e
  用来判断文件或目录是否存在
  -x和!-x
  用来判断文件是否可执行
  if指令语法实例
  #如果UA包含"MSIE",rewrite请求到/msid/目录下
  if ($http_user_agent ~ MSIE) {
  rewrite ^(.*)$ /msie/$1 break;
  }
  #如果cookie匹配正则,设置变量$id等于正则引用部分
  if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
  set $id $1;
  }
  #如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
  if ($request_method = POST) {
  return 405;
  }
  #限速,$slow可以通过 set 指令设置
  if ($slow) {
  limit_rate 10k;
  }
  #如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
  if (!-f $request_filename){
  break;
  proxy_pass  http://127.0.0.1;
  }
  #如果query string中包含"post=140",永久重定向到example.com
  if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
  }
  #防盗链
  location ~* \.(gif|jpg|png|swf|flv)$ {
  valid_referers none blocked www.jefflei.com www.leizhenfang.com;
  if ($invalid_referer) {
  return 404;
  }
  }
(2)if判断可使用的全局变量
  变量名称
  变量说明
  $args
  这个变量等于请求行中的参数,同$query_string
  $content_length
  请求头中的Content-length字段
  $content_type
  请求头中的Content-Type字段
  $document_root
  当前请求在root指令中指定的值
  $host
  请求主机头字段,否则为服务器名称
  $http_user_agent
  客户端agent信息
  $http_cookie
  客户端cookie信息
  $limit_rate
  这个变量可以限制连接速率
  $request_method
  客户端请求的动作,通常为GET或POST
  $remote_addr
  客户端的IP地址
  $remote_port
  客户端的端口
  $remote_user
  已经经过Auth Basic Module验证的用户名
  $request_filename
  当前请求的文件路径,由root或alias指令与URI请求生成
  $scheme
  HTTP方法(如http,https)
  $server_protocol
  请求使用的协议,通常是HTTP/1.0或HTTP/1.1
  $server_addr
  服务器地址,在完成一次系统调用后可以确定这个值
  $server_name
  服务器名称
  $server_port
  请求到达服务器的端口号
  $request_uri
  包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”
  $uri
  不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”
  $document_uri
  与$uri相同
  例:
  http://localhost:88/test1/test2/test.php
  $host:localhost
  $server_port:88
  $request_uri:http://localhost:88/test1/test2/test.php
  $document_uri:/test1/test2/test.php
  $document_root:/var/www/html
  $request_filename:/var/www/html/test1/test2/test.php


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-632054-1-1.html 上篇帖子: No.5 Nginx急速入门 下篇帖子: 轻量级HTTP服务器Nginx(配置与调试Nginx)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表