zoukankan      html  css  js  c++  java
  • Nginx Rewrite规则详解

    rewrite自我总结:每次url跳转都是从上到下都匹配一遍,也就是说每次匹配到一个rewrite规则后,跳转后的url又将从头匹配所有的规则。如果碰到last和break,将终止匹配后面的规则,但是last跳转后的地址还将重新匹配last以上的规则,但是break将终止匹配规则。

    Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。Rewrite URL规则重写的用途:

    1)对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;

    2)隐藏网站URL真实地址,浏览器显示更加美观;

    3)  网站变更升级,可以基于Rewrite临时重定向到其他页面。

    Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量,如下为三个概念的详解:

    1、Nginx Rewrite结尾标识符

    用于Rewrite规则末尾,表示规则的执行属性。

    last              相当于Apache里的(L)标记,表示完成rewrite匹配;
    break             本条规则匹配完成后,终止匹配,不再匹配后面的规则。  
    redirect          返回302临时重定向,浏览器地址会显示跳转后的URL地址。 
    permanent         返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。  
    其中last和break    用来实现URL重写时,浏览器地址栏URL地址不变。
    注:当跳转的URL为完整地址时,无论结尾标识符是permanent还是last,都会URL跳转;只有为相对路径时,结尾标识符为last,浏览器地址栏URL地址不变。

    2、Nginx Rewrite规则常用表达式

    主要用于匹配参数、字符串及过滤设置。

    .                                 匹配任何单字符;
    [0-9]                             匹配字符串:0-9;
    [^0-9]                             不匹配字符串:0-9;
    jfedu|jfteach                         可选择的字符串:jfedu|jfteach;
    ?                                 匹配0到1个字符;
    *                                 匹配0到多个字符;
    +                                 匹配1到多个字符;
    ^                                 字符串开始标志;
    $                                 字符串结束标志;
    
                                     转义符标志。

    3、 Nginx Rewrite变量

    常用于匹配HTTP请求头信息、浏览器主机名、URL等。

    HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
    connection & request: REMOTE_ADDR, QUERY_STRING;
    server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
    system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
    详解如下:
    HTTP_USER_AGENT        用户使用的代理,例如浏览器;
    HTTP_REFERER           告知服务器,从哪个页面来访问的;
    HTTP_COOKIE            客户端缓存,主要用于存储用户名和密码等信息;
    HTTP_HOST              匹配服务器ServerName域名;
    HTTP_ACCEPT            客户端的浏览器支持的MIME类型;    
    REMOTE_ADDR            客户端的IP地址
    QUERY_STRING           URL中访问的字符串;
    DOCUMENT_ROOT          服务器发布目录;
    SERVER_PORT            服务器端口;
    SERVER_PROTOCOL        服务器端协议;
    TIME_YEAR              年;
    TIME_MON               月;
    TIME_DAY               日;

    4、企业中常用的Nginx Rewrite案例如下:

    Nginx Rewrite以下配置均配置在nginx.conf或者vhosts.conf中,

    1)将jfedu.net跳转至www.jfedu.net。

    if ($host = 'jfedu.net' ) {
            rewrite ^/(.*)$ http://www.jfedu.net/$1  permanent;
    }

    2)访问www.jfedu.net跳转www.test.com/new.index.html

    rewrite   ^/$  http://www.test.com/index01.html  permanent;

    3)访问/jfedu/test01/跳转至/newindex.html,浏览器地址不变。

    rewrite   ^/jfedu/test01/$     /newindex.html     last;

    4)多域名跳转到www.jfedu.net。

    if ($host != ‘www.jfedu.net’ ) {
    rewrite ^/(.*)$  http://www.jfedu.net/$1  permanent;
    }

    5)访问文件和目录不存在跳转至index.php。

    if ( ! -e $request_filename )
    {
    rewrite  ^/(.*)$  /index.php  last;
    }

    6)目录对换 /xxxx/123456  ====>  /xxxx?id=123456:

    rewrite    ^/(.+)/(d+)      /$1?id=$2       last;

    7)判断浏览器User Agent跳转。

    if( $http_user_agent  ~ MSIE)
    {
    rewrite ^(.*)$ /ie/$1 break;
    }

    8)禁止访问以.sh,.flv,.mp3为文件后缀名的文件。

    location ~ .*.(sh|flv|mp3)$
    {
        return 403;
    }  

    9)将移动用户访问跳转至移动端。

    if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )
    {
    rewrite ^/$      http://m.jfedu.net/       permanent;
    }

    10)匹配URL访问字符串跳转。

    if ($args ~* tid=13){
     return 404;
    }

    11)访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。

    rewrite   ^/([0-9]+)/jfedu/(.+)$     /index.php?tid/$1/items=$2     last;
  • 相关阅读:
    传统金融和互联网金融
    集团培训
    Javascript和JQuery之间的联系
    this和$(this)区别
    原生JavaScript支持6种方式获取元素
    绩效考核
    web服务端安全之分布式拒绝服务攻击
    web服务端安全之暴力破解
    web服务端安全之权限漏洞
    web服务端安全之文件上传漏洞
  • 原文地址:https://www.cnblogs.com/deny/p/10022513.html
Copyright © 2011-2022 走看看