nginx配置location及rewrite规则重写:虚拟主机与云服务器的区别

時間:2023-12-29 02:51:35 作者:虚拟主机与云服务器的区别 熱度:虚拟主机与云服务器的区别
虚拟主机与云服务器的区别描述::

假如基于WEB根目录下,要制止用户拜访config目录,或者要制止用户拜访configini(ZF常用INI,不过建议还是放到WEB目录以外的场所),可以通过location进行配置,返回403或者404等

在nginx要制止某个或一类资源,只需要增加一个location,然后在其中采用deny all即可。

制止拜访开拓名为bat的文件,配置如下:

location~*bat{
denyall;
}

制止拜访configs目录,以及其下所有子目录或文件,配置如下:

location^~configs{
denyall;
}

留心上述configs后面的斜杠不能少,否则所有以configs开头的目录或文件都将返回403制止拜访。

下面详细说明nginx配置location及rerite条例重写

location={
准确匹配,主机名后面不能带任何字符串
[configurationA]
}

location{
由于所有的地址都以开头,所以这条条例将匹配到所有请愿
但是正则和最长字符串会优先匹配
[configurationB]
}

locationdocuments{
匹配任何以documents开头的地址,匹配符合以后,还要继续往下搜索
只有后面的正则表达式没有匹配到时,这一条才会使用这一条
[configurationC]
}

location~documentsAbc{
匹配任何以documents开头的地址,匹配符合以后,还要继续往下搜索
只有后面的正则表达式没有匹配到时,这一条才会使用这一条
[configurationCC]
}

location^~images{
匹配任何以images开头的地址,匹配符合以后,停止往下搜索正则,使用这一条。
[configurationD]
}

location~*\(gif|jpg|jpeg)${
匹配所有以gif,jpg或jpeg结尾的请愿
然而,所有请愿images下的图片会被configD处置,由于^~达到不了这一条正则
[configurationE]
}

locationimages{
字符匹配到images,继续往下,会发明^~存在
[configurationF]
}

locationimagesabc{
最长字符匹配到imagesabc,继续往下,会发明^~存在
F与G的放置次序是没有关系的
[configurationG]
}

location~imagesabc{
只有去掉configD才有效:先最长匹配configG开头的地址,继续往下搜索,匹配到这一条正则,使用
[configurationH]
}

location~*js*\js
  • 已=开头表示准确匹配如 A 中只匹配根目录结尾的请愿,后面不能带任何字符串。

  • ^~开头表示uri以某个常规字符串开头,不是正则匹配

  • ~ 开头表示分辨大小写的正则匹配;

  • ~* 开头表示不分辨大小写的正则匹配

  • 通用匹配, 假如没有其它匹配,任何请愿都会匹配到

    • 次序 no优先级:

      (location =) (location 完整路径) (location ^~ 路径) (location ~,~* 正则次序) (location 部门起始路径) ()

      上面的匹配结局

      依照上面的location写法,以下的匹配示例成立:

      • - config A准确彻底匹配,即使index也匹配不了

      • donloadsdonload - config B匹配B以后,往下没有任何匹配,使用B

      • images1gif - configuration D匹配到F,往下匹配到D,停止往下

      • imagesabcdef - config D最长匹配到G,往下匹配D,停止往下你可以看到 任何以images开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配次序

      • documentsdocument - config C匹配到C,往下没有任何匹配,使用C

      • documents1jpg - configuration E匹配到C,往下正则匹配到E

      • documentsAbcjpg - config CC最长匹配到C,往下正则次序匹配到CC,不会往下到E

      • 所以实际采用中,个人觉得至少有三个匹配条例定义,如下:

        • 直接匹配网站根,通过域名拜访网站首页对照频繁,采用这个会加速处置,如是说。
          这里是直接转发给后端利用服务器了,也可以是一个静态首页
          第一个必选条例
          location={
          proxy_passtomcat8080index
          }
          第二个必选条例是处置静态文件请愿,这是nginx作为服务器的强项
          有两种配置模式,目录匹配或后缀匹配,任选其一或搭配采用
          location^~static{
          rootebrootstatic;
          }
          location~*\(gif|jpg|jpeg|png|css|js|ico)${
          rootebrootres;
          }
          第三个条例就是通用条例,用来转发动态请愿到后端利用服务器
          非静态文件请愿就默认是动态请愿,自己依据实际掌握
          终究目前的一些框架的流行,带php,jsp后缀的场合很少了
          location{
          proxy_passtomcat8080
          }

          Rerite条例

          rerite性能就是,采用nginx提供的全局变量或自己设置的变量,交融正则表达式和标记位实现url重写以及重定向。

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

          例如seanlookaeindexphp?=1u=str只对aeindexphp重写。语法rerite regex replacement [flag];

          假如相对域名或参数字符串起作用,可以采用全局变量匹配,也可以采用proxy_pass反向代理。

          表明看rerite和location性能有点像,都能实现跳转,主要区别在于rerite是在同一域名内更换获取资源的路径,而location是对一类路径做管理拜访或反向代理,可以proxy_pass到其他机器。许多场合下rerite也会写在location里,它们的执行次序是:

          1. 执行server块的rerite指令

          2. 执行location匹配

          3. 执行选定的location中的rerite指令

          4. 假如其中某步URI被重写,则重新轮回执行1-3,直到找到真实存在的文件;轮回过份10次,则返回500 Internal Server Error过错。

            1. flag标记位

              • last 相当于Apache的[L]标志,表示完成rerite

              • break 停止执行当前虚拟主机的后续rerite指令集

              • redirect 返回302临时重定向,地址栏会显示跳转后的地址

              • permanent 返回301永久重定向,地址栏会显示跳转后的地址

                • 由于301和302不能简朴的只返回状态码,还必要有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以懂得:

                  1. last一般写在server和if中,而break一般采用在location中

                  2. last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配

                  3. break和last都能结构继续执行后面的rerite指令

                    1. if指令与全局变量

                      if判断指令

                      语法为if(condition){},对给定的条件condition进行判断。假如为真,大括号内的rerite指令将被执行,if条件(conditon)可以是如下任何内容:

                      • 当表达式只是一个变量时,假如值为空或任何以0开头的字符串都会当做false

                      • 直接对照变量和内容时,采用=或!=

                      • ~正则表达式匹配,~*不分辨大小写的匹配,!~分辨大小写的不匹配

                        • -f和!-f用来判断是否存在文件

                          -d和!-d用来判断是否存在目录

                          -e和!-e用来判断是否存在文件或目录

                          -x和!-x用来判断文件是否可执行

                          例如:

                          if($_user_agent~MSIE){
                          rerite^(*)$msiebreak;
                          }假如UA涵盖MSIE,rerite请愿到ms目录下
                          
                          if($_cookie~*=([^;]+)(?;|$)){
                          set$;
                          }假如cookie匹配正则,设置变量$等于正则引用部门
                          
                          if($request_method=POST){
                          return405;
                          }假如提交想法为POST,则返回状态405(Methodnotalloed)。return不能返回301,302
                          
                          if($slo){
                          limit_rate10k;
                          }限速,$slo可以通过set指令设置
                          
                          if(!-f$request_filename){
                          break;
                          proxy_pass127001;
                          }假如请愿的文件名不存在,则反向代理到localhost。这里的break也是停止rerite查验
                          
                          if($args~post=140){
                          rerite^examplepermanent;
                          }假如querystring中涵盖post=140,永久重定向到example
                          
                          location~*\(gif|jpg|png|sf|flv)${
                          val_referersnoneblockedjeffleileizhenfang;
                          if($inval_referer){
                          return404;
                          }防盗链
                          }

                          全局变量

                          下面是可以用作if判断的全局变量

                          • $args: 这个变量等于请愿行中的参数,同$query_string

                          • $content_length: 请愿头中的Content-length字段。

                          • $content_type: 请愿头中的Content-Type字段。

                          • $document_root: 当前请愿在root指令中指定的值。

                          • $host: 请愿主机头字段,否则为服务器名称。

                          • $_user_agent: 客户端agent信息

                          • $_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想法(如,s)。

                          • $server_protocol: 请愿采用的协议,通常是HTTP10或HTTP11。

                          • $server_addr: 服务器地址,在完成一次系统调用后可以确认这个值。

                          • $server_name: 服务器名称。

                          • $server_port: 请愿达到服务器的端口号。

                          • $request_uri: 涵盖请愿参数的原始URI,不涵盖主机名,如:”foobarphp?arg=baz”。

                          • $uri: 不带请愿参数确当前URI,$uri不涵盖主机名,如”foobar”。

                          • $document_uri: 与$uri雷同。

                            • 例:localhost88test1test2testphp

                              $host:localhost

                              $server_port:88

                              $request_uri:localhost88test1test2testphp

                              $document_uri:test1test2testphp

                              $document_root:var

                              $request_filename:vartest1test2testphp

                              常用正则

                              • : 匹配除换行符以外的任意字符

                              • ?: 重复0次或1次

                              • +: 重复1次或更多次

                              • *: 重复0次或更多次

                              • \d:匹配数字

                              • ^: 匹配字符串的开端

                              • $: 匹配字符串的介绍

                              • {n}: 重复n次

                              • {n,}: 重复n次或更多次

                              • [c]: 匹配单个字符c

                              • [a-z]: 匹配a-z小写字母的任意一个

                                • 小括号()之间匹配的内容,可以在后面通过来引用,表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义不同凡响字符。

                                  rerite实例

                                  例1:

                                  {
                                  定义image日志形式
                                  log_formatimagelog[$time_local]$image_file$image_type$body_bytes_sent$status;
                                  开启重写日志
                                  rerite_logon;
                                  
                                  server{
                                  roothome;
                                  
                                  location{
                                  重写条例信息
                                  error_loglogsreritelognotice;
                                  留心这里要用‘’单引号引起来,避免{}
                                  rerite^images([a-z]{2})([a-z0-9]{5})(*)\(png|jpg|gif)$data?file=;
                                  留心不能在上面这条条例后面加上“last”参数,否则下面的set指令不会执行
                                  set$image_file;
                                  set$image_type;
                                  }
                                  
                                  locationdata{
                                  指定针对图片的日志形式,来解析图片类型和大小
                                  access_loglogsimageslogmian;
                                  rootdataimages;
                                  利用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,假如还不在就跳转到最后一个url里
                                  try_files$arg_fileimage404;
                                  }
                                  location=image404{
                                  图片不存在返回特定的信息
                                  return404imagenotfound\n;
                                  }
                                  }

                                  对形如imagesefuh7b3testpng的请愿,重写到data?file=testpng,于是匹配到location data,先看dataimagestestpng文件存不存在,假如存在则正常响应,假如不存在则重写tryfiles到新的image404 location,直接返回404状态码。

                                  例2:

                                  rerite^images(*)_(\d+)x(\d+)\(png|jpg|gif)$resizer?th=height=?last;

                                  对形如imagesbla_500x400jpg的文件请愿,重写到resizerblajpg?th=500height=400地址,并会继续尝试匹配location。

站長聲明:以上關於【nginx配置location及rewrite规则重写-虚拟主机与云服务器的区别】的內容是由各互聯網用戶貢獻並自行上傳的,我們新聞網站並不擁有所有權的故也不會承擔相關法律責任。如您發現具有涉嫌版權及其它版權的內容,歡迎發送至:1@qq.com 進行相關的舉報,本站人員會在2~3個工作日內親自聯繫您,一經查實我們將立刻刪除相關的涉嫌侵權內容。