• Nginx重写规则


    Nginx的重写规则,依赖于pcre库(perl compatible regular expression)。所以在安装的时候一定要让nginx支持这个功能,以及安装pcre-devel,prce.

    nginx rewrite 正则表达式匹配

    大小写匹配

    ~ 为区分大小写匹配

    ~* 为不区分大小写匹配

    !~和!~*分别为 区分大小写但不匹配 及 不区分大小写但不匹配

    ^~ URI    不使用正则匹配,可用使用元字符匹配

    文件及目录匹配

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

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

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

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

    flag标记

    last本次重写完成之后,重启下一轮检查 a[test]->a[test] ,注意如果重写规则的uri中和本段的location中uri有重复,则注意避免死循环,死循环10次后会返回500错误。

    break 终止匹配, 不再匹配本段的内容。a[test]->b[test] completed!

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

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

    break和last区别举例:

    ####

    server {

    ...

    rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;

    rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra last;

    return 403;                #本段中location中匹配的内容和重写规则中没有重复的

    ...

    }

    But if these directives are put inside the "/download/" location, the last flag should be replaced by break, or otherwise nginx will make 10 cycles and return the 500 error:

    location /download/ {

    rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 break;

    rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra break;

    return 403;

    }

    #####

    if指定的使用:格式和c语言相同,

    if (condition){

        rewrite …

    }

    注意这里的if不支持嵌套,也不支持&& 和 ||逻辑判断

    set 使用:set var $avg

    rewrite_log:默认off,如果为on话,会以notic级别记录到error.log

    一些例子:

    1. http转https:rewrite ^(.*) https://www.wxl.com$1 permanent;
    2. 域名跳转,将bbsX.wxl.com 转到http://www.baidu.com

      location / {

      root html;

      index index.html index.htm;

      if ($host ~ '^bbsd{1}.wxl.com'){

        rewrite ^(.*) http://www.baidu.com$1 permanent;

        }

      }

      3.文件读写分离:文件上传的WebDav,基于http1.1协议,扩展了http1.1,在GET,POST,HEAD的其他功能,在我们作实验的时候,可以使用Apache打开Dav On

      location / {

          proxy_pass http://read_upstream;

          if ($request_method = "PUT"){

              proxy_pass http://write_upsteam;

      }

    }

    4. 目录自动添加/,这个功能一般浏览器自动完成.如果使用index.html在二级目录下,比如/data/bbs/index.html,如果输入/data/bbs浏览器不会跳转到主页面index.html

      location ^~ /bbs {

      if (-d $request_filename){ 

      rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 

      

      }

      5. 目录合并

      如果uri中有很多目录的话,将不利于搜索引擎的搜索,通过重写规则可以让uri目录看起来很少。  

      rewrite ^/server-([0-9]+)/ -([0-9]+)/ -([0-9]+)/ -([0-9]+)/.html$ /server/$1/$2/$3/$4.html last;

      break;

      这样地址栏输入http://www.wxl-dede.com/server-12-12-12-12.html,

      实际访问的是http://www.wxl-dede.com/server/12/12/12/12.html

      6.禁止访问某个目录

      location ~ ^/(cron|templates)/ { 

          deny all; break; 

      } 

    7. 针对不同浏览器访问不同的内容

      if ($http_user_agent ~ Chrome){

      rewrite ^(.*)$ /data/index.html break;

      }

    8. 自定义某一类型的文件的保质期时间

      location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {

      if (-f $request_filename) {

      expires 1h;

      break;

      }

      }

    Nginx防盗链

    盗链的概念,自己网站不存在的资源,链接到其他网站的资源。但对其他网站会造成额外的消耗,unfair。

    在http的请求头部中refrer头域中的值记录访问目标的源地址,因此在nginx中可以通过制定合法的URL,来防止防盗链。

    语法: valid_referers none | blocked | server_names | string …;

    none    来源头部为空的情况

    blocked    防火墙删除了http://或者 https://

    server_names    制定特定的主机,支持匹配符,支持正则

    例子:基于资源的防盗链

    location ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

    valid_referers none blocked *.wxl.com;

    if ($invalid_referer) {

        return 403;

        rewrite ^/ http://img.jjonline.cn/forbid.gif;

    break;

    }

    对jpg,jpeg等资源进行防止盗链。

    当然也可以基于目录

    root /server/file/;

    valid_referers none blocked *.wxl.com;

    if ($invalid_referer) {

        return 403;

        rewrite ^/ http://img.jjonline.cn/forbid.gif;

    break;

    }

  • 相关阅读:
    HDU5120
    POJ 1062
    POJ 1086
    BestCoder 1st Anniversary (HDU 5311)
    HDU 5284
    Dylans loves sequence(hdu5273)
    day65 作业
    第三次小组分享 猴子补丁
    day59 csrf auth
    day58 cookie session 中间件
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5135449.html
Copyright © 2020-2023  润新知