精华内容
下载资源
问答
  • Nginx之八 URL重写(rewrite)配置

    万次阅读 2018-10-23 22:17:54
    Nginx URL重写(rewrite)配置及信息详解 1)if判断指令 语法为if(condition){...},对给定的条件condition进行判断。 如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容: a: 当...

    Nginx URL重写(rewrite)配置及信息详解

    1)if判断指令

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

      a:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false,其他情况为true。
      b: 直接比较变量和内容时,使用 = 或!=
      c: 正则表达式匹配,*不区分大小写的匹配,!和!*反之。

    注意:使用正则表达式字符串一般不需要加引号,但是如果含有右花括号“}”或者分号“;”字符时,必须要给整个正则表达式加引号

    其他指令:
    -f和!-f用来判断请求文件是否存在
    -d和!-d用来判断请求目录是否存在
    -e和!-e用来判断是请求的文件或者目录否存在
    -x和!-x用来判断请求的文件是否可执行

    例子:if (-f $request_filename){
            … #判断请求的文件是否存在,存在就执行这里面的代码块
        }

    2)break指令

    用于中断当前相同作用域中的Nginx配置,和Java中的break语法类似,可以在server块和location以及if块中使用。
    语法:break;

    3)if 可用的全局变量
    还有$host_host变量,和$host区别如下:
    $host不带端口,$http_host带端口
    在这里插入图片描述

    4)return指令

     该指令用于完成对请求的处理,直接向客户端响应状态的代码。和Java中的return语法类似。可以再server块和location以及if块中使用。

     语法:return code URL;  #code表示状态码,URL表示返回给客户单的URL地址
     或者:return URL: #当状态码是302或者307的时候,可以使用,返回的URL必须包含“http://”、“https://”或者直接使用“$scheme”变量(RequestScheme代表传输协议,
    Nginx内置变量)
      或者 return [text]; #为返回给客户端的响应体内容,支持变量的使用

    5)rewrite指令

     该指令通过正则表达式的使用来改变URI.可以同时存在一个或者多个指令,按照顺序一次对URL进行匹配和处理。该指令可以在server块后者location块中配置

      语法:  指令语法:rewrite regex replacement [flag];
       rewrite是实现URL重定向的重要指令,  
       regex:用来匹配URI的正则表达式;
       replacement:匹配成功后用来替换URI中被截取内容的字符串,默认情况如果该字符串包含“http://”、"https://"开头,则不会继续向下对URI进行其他处理。直接返回重写的URI给客户端
        flag:用来设置rewrite对URI的处理行为,包含如下数据:

    标记符号 说明
    last 终止在本location块中处理接收到的URI,并将此处重写的URI作为新的URI使用其他location进行处理。(只是终止当前location的处理)
    break 将此处重写的URI作为一个新的URI在当前location中继续执行,并不会将新的URI转向其他location。
    redirect 将重写后的URI返回个客户端,状态码是302,表明临时重定向,主要用在replacement字符串不以“http://”,“ https://”或“ $scheme” 开头;
    permanent 将重写的URI返回客户端,状态码为301,指明是永久重定向;

    6)rewrite_log指令

    该指令用于是否开启URL重写日志的输出,
    语法:
      rewrite_log on | off
      默认是off,如果配置为on,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件中

    7)set指令

    用来设置新的变量,
      语法: set variable value;
        variable,这个是变量的名称,这个符号的“$”必须作为变量第一个字符,并且不能和Nginx服务器预设的全局变量同名
        value,为变量的值。
    比如 set $id “3”; #设置id为3

    8)uninitialized_variable_warn指令

    这个指令用来配置会用未初始化的变量时,是否记录警告日志,
     语法: unitialized_variable_warn on | off
      默认设置时on状态

    9)防盗链的例子

       语法:valid_referers none | blocked | server_name | string ...;
    

    这里表示请求头部Referer域是否匹配上面值,如果匹配了$invalid_referer 的值为0,没有相匹配就是1;

    字符 说明
    none 表示Referer头域不存在的情况
    blocked 检测Referer头域的值被防火墙或者代理服务器删除或者伪装的情况,这种情况,该头域的值不以“http://”或者“https://”开头
    server_name 设置一个或者多个URL,检测Referer头域的值是否是这些URL中的某个

    10)例子

    例子一(域名跳转):
        server {
                listen 80;
                server_name   abc.com;
                rewrite   ^/(.*)     http://www.ab c.com/$1 permanent;  # 跳转到www.abc.com网址上
            }
    例子二:
      server {
                listen 80;
                server_name   www.myweb.com www.web.info
                if($host ~ myweb\.info){                        #"."需要使用“\”转义,这里是匹配到www.web.info时
                         rewrite ^(.*)  http://www.myweb.com/&1 permanent;   #永久重定向到http://www.myweb.com网址上&1是匹配的uri
                }
            }
    例子三(防盗链):
    location ~* \.(gif|jpg|png|swf|flv)$ {
        valid_referers none blocked www.vison.com www.wsvison.com;  #这里表示Referer头域中的值是none或者blocked或者后面这些网址才会返回去正常的gif|jpg|png|swf|flv文件,否则执行下面if块代码
        if ($invalid_referer) {  #上面没有匹配成功,$invalid_referer值为1,否则为0
            return 404;
        } //防盗链
    }       
    其他例子:    
    if ($http_user_agent ~ MSIE) {
        rewrite ^(.*)$ /msie/$1 break;
    } //如果UA包含"MSIE",rewrite请求到/msid/目录下
    
    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
        set $id $1;
     } //如果cookie匹配正则,设置变量$id等于正则引用部分
    
    if ($request_method = POST) {
        return 405;
    } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
    
    if ($slow) {
        limit_rate 10k;
    } //限速,$slow可以通过 set 指令设置
    
    if (!-f $request_filename){
        break;
        proxy_pass  http://127.0.0.1; 
    } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
    
    if ($args ~ post=140){
        rewrite ^ http://example.com/ permanent;
    } //如果query string中包含"post=140",永久重定向到example.com
    

    参考:https://segmentfault.com/a/1190000002797606#articleHeader0

    展开全文
  • Nginx rewrite

    万次阅读 2019-04-25 14:50:29
    一、rewrite介绍 rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器。 Nginx提供...

    一、rewrite介绍

    rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器。

    Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
    rewrite只能放在server{},location{},if{}中,
    并且只能对域名后边的除去传递的参数外的字符串起作用。
    Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
    通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

    二、ReWrite相关指令

    指令 默认值 使用范围 作用
    break none if,server,location 完成当前的规则集,不再处理rewrite指令,需要和last加以区分
    if ( condition ) { … } none server,location 用于检测一个条件是否符合,符合则执行大括号内的语句。不支持嵌套,不支持多个条件&&或处理
    return none server,if,location 用于结束规则的执行和返回状态码给客户端。状态码的值可以是:204,400,402,406,408,410,411,413,416以及500~504,另外非标准状态码444,表示以不发送任何的Header头来结束连接。
    rewrite regex replacement flag server,location,if 该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。
    uninitialized_variable_warn on/off on http,server,location,if 该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。
    set variable value none 该指令用于定义一个变量,并且给变量进行赋值。变量的值可以是文本、一个变量或者变量和文本的联合,文本需要用引号引起来。

    三、rewrite常用全局变量在这里插入图片描述在这里插入图片描述

    四、Nginx rewrite语法

    1、rewrite指令语法

    指令语法: rewrite regex replacement [flag]
    默认值: none
    应用位置:server、location、if
    rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。
    下面是一个简单地URL rewrite跳转的例子:

    rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
    

    在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.etiantian.org/$1。这里的$1是取前面regex部分括号里的内容结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。

    2、rewrite指令结尾的flag标记说明

    flag标记符号 说 明
    last 本条规则匹配完成后,继续向下匹配新的location URI规则
    break 本条规则匹配完成即终止,不再匹配后面的任何规则
    redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
    permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

    在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL地址。
    last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

    五、例子

    1、 break

    参数项:break,用于停止执行rewrite模块的指令,但是其他模块不受影响。

    配置位置:server,location,if
    示例

    server {
            listen       80;
            server_name  localhost;
            #===== break && rewrite test =====
            #这里如果注释掉break,所有请求进来都是返回http200,this is breaktest...
            break;
            return 200 "this is breaktest...";
            location = /breaktest {
                break;
                return 200 $request_uri;
                proxy_pass http://192.168.88.38/other;
            }
            location / {
                return 200 $request_uri;
            }
    

    测试链接:http://192.168.88.38/breaktest ,请求到达server块后,被break终止执行rewrite指令集,return属于rewrite模块指令集,所以return 200 “this is breaktest…”不会执行;因为没有返回结果,所以继续执行location匹配,请求匹配到location = /breaktest{}之后,break终止return 200 $request_uri,而proxy_pass属于ngx_http_proxy_module,仍会继续执行,反向代理后的新url匹配到location /{},因此最终返回结果为 http200,/other,如下图:
    在这里插入图片描述

    2、set
    配置位置:server,location,if,用于为变量赋值
    示例:

    server {
            listen       80;
            server_name  localhost;
            #===== break && rewrite test =====
            #这里如果注释掉break,所有请求进来都是返回http200,this is breaktest...
            break;
            return 200 "this is breaktest...";
            location = /breaktest {
                break;
                return 200 $request_uri;
                proxy_pass http://192.168.88.38/other;
            }
            location / {
                #set赋值,可以直接赋字符串,或是变量,如下是变量和字符串的组合
                set $set_value_test “112233 $request_uri”;
                return 200 $set_value_test;
            }
    

    测试链接http://192.168.88.38/breaktest,使用效果如下图:
    在这里插入图片描述

    3.if

    配置位置:server,location,用于依据指定的条件,决定是否执行if块中的语句

    判断条件:

    3.1.变量值为空或为0,都为false;

    示例:

    set $if_value_test “0”;
          #注意这里if、()和{}要空格,否则会报错..略坑,不过这也是代码规范了
          if ($if_value_test) {
             #不会执行,因为$if_value_test值为0,false
             return 200;
    }
    

    3.2.变量与字符串比较,=为等于,!=为不等

    3.3.变量与正则表达式匹配,~ 为区分大小写匹配,~* 为不区分大小写匹配,!~ , !~*前面两者的非操作

    示例:

    
    if ($request_uri ~ “^/breaktest$”) {
          #测试链接http://192.168.88.38/breaktest,最终返回http200
          return 200;
    }
    

    3.4.检查文件是否存在,-f存在即为true,!-f不存在即为true

    3.5.检查目录是否存在,-d存在即为true,!-d不存在即为true

    3.6.检查文件或目录是否存在,-e存在即为true,!-e不存在即为true

    3.7.检查文件是否可执行,-x可执行即为true,!-x不可执行即为true

    示例:

    if (-e /usr/local/nginx/conf) {
          return 200;
    }
    

    其他示例:

    
    if ($http_user_agent ~ MSIE) {
    
        rewrite ^(.*)$ /msie/$1 break;
    
    } //如果UA包含"MSIE",rewrite请求到/msid/目录下
    
    
    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    
        set $id $1;
    
     } //如果cookie匹配正则,设置变量$id等于正则引用部分
      
    
    if ($request_method = POST) {
    
        return 405;
    
    } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
    
    
    if ($slow) {
    
        limit_rate 10k;
    
    } //限速,$slow可以通过 set 指令设置
    
    
    if (!-f $request_filename){
    
        break;
    
        proxy_pass  http://127.0.0.1; 
    
    } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
    
     
    if ($args ~ post=140){
    
        rewrite ^ http://mysite.com/ permanent;
    
    } //如果query string中包含"post=140",永久重定向到mysite.com
    

    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相同。

    4.return

    配置位置:server,location,if

    参数值:return code [text]返回状态码及文本、return url重定向、return code url重定向

    5.rewrite

    配置位置:server,location,if

    参数值:rewrite regex replacement [flag],用于以正则表达式匹配特定格式的url并重写url.

    regex为正则表达式,replacement为重写的内容,flag为rewrite的标识位

    replacement:重写的url带http,表示重定向

    示例:

    location / {
        #测试链接http://192.168.88.38/test/,被重定向到百度首页,后面的语句不会再执行
        rewrite /test/(.*) http://www.baidu.com;
        set $set_value_test "112233 $request_uri";
        return 200 $set_value_test;
    }
    

    replacement:重写的url不带http,单纯的重写url
    示例:

    location / {
               #测试链接http://192.168.88.38/test/,匹配到location /{}后url被重写为http://192.168.88.38/breaktest,继续搜索匹配
               #匹配到location = /breaktest{},最终返回http200及this is breaktest
               rewrite /test/(.*) /breaktest;
            }
            location = /breaktest {
               return 200 "this is breaktest";
            }
    

    6、flag
    flag:用于设置重写url后的进一步操作,有break,last,redirect,permanent,rewrite不带flag时,多个rewrite指令顺序执行,当location中没有可执行的rewrite模块指令时,重新发起一次location匹配,下面说明各个flag的用途:

    break:和上面讲的break用途及用法一样,终止执行rewrite模块指令集;
    last:终止执行rewrite模块指令集,并开始搜寻重写url后匹配的location;
    redirect:临时重定向
    permanent:永久重定向
    示例:

     location / {
               #测试链接http://192.168.88.38/test1,匹配到location / {}
               rewrite ^/test1 /test2;#被重写为/test2,继续往下执行rewrite
               rewrite ^/test2 /test3;#被重写为/test3,往下没有可执行的rewrite模块指令,发起一次location匹配,匹配到location /test3 {},最终返回http200及/test3
            }
            location /test2 {
                return 200 "/test2";
            }
            location /test3 {
                return 200 "/test3";
            }
    

    last和break的区别在于,last会发起新的location匹配,而break不会。
    示例:

    location / {
               rewrite ^/test1 /test2;
               rewrite ^/test2 /test3 last;
               rewrite ^/test3 /test4;
            }
            location /test2 {
                return 200 "/test2";
            }
            location /test3 {
                return 200 "/test3";
            }
            location /test4 {
                return 200 "/test4";
            }
    

    测试链接:http://192.168.88.38/test1 匹配到 location / {}后,被重写为/test2,顺序执行再次被重写为/test3,因为flag为last,所以不会继续重写为/test4,而是发起一次location匹配,匹配到location /test3{},所以最终返回结果为http200及/test3;

    如果把location /{}中的last改为break,被重写为/test3后,不再重写为/test4,也不会发起location,最终没有可匹配的资源,返回http404。

    7、正则匹配URL的参数传递

    小括号()之间匹配的内容,可以在后面通过 $下标 来引用,如11表示引用第一个小括号匹配的内容,表示引用第二个小括号匹配的内容。

    示例:

    location / {
               rewrite ^/(test1)/(test2)/(test3) /$2/$3;
               return 200 $2-$3;
            }
    

    最终返回结果:
    在这里插入图片描述

    参考:
    https://blog.csdn.net/u010798968/article/details/76674434
    https://www.cnblogs.com/crazylqy/p/6892010.html

    展开全文
  • Nginx Rewrite

    2018-07-10 23:48:08
    Nginx Rewrite1. 什么是Nginx Rewrite和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译...

    Nginx Rewrite

    1. 什么是Nginx Rewrite

    apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。

    2. Nginx Rewrite

        rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

    rewrite语法格式及参数语法说明如下:

        rewrite    <regex>    <replacement>    [flag];

     

    关键字      正则        替代内容          flag标记

    例子:

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

    rewrite为固定关键字,表示开始进行rewrite匹配规则,regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址,replacement部分是http://www.ceshi.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.ceshi.com/$1 地址上。

    3. 实验:

    3.1服务器配置:

    [root@web01 extra]# vim www.conf

    server {

            listen       80;

            server_name  www.etiantian.org etiantian.org;

            location / {

            root html/www;

            index index.html;

            }   

            location ^~ /images/ {

            rewrite ^/(.*) http://blog.ceshi.com/$1 permanent;

            }

            access_log    logs/www_access.log    main;

    }

    3.2检查语法并重启

    [root@web01 extra]# /application/nginx/sbin/nginx -t

    [root@web01 extra]# /application/nginx/sbin/nginx -s reload

    3.3浏览器测试

    (1)直接输入http://www.etiantian.org/

      

    (2)http://www.etiantian.org/ceshi

     

    Nginx Rewrite的企业应用场景:

       可以调整用户浏览器的URL,看起来更规范,合乎开发及产品人员的需求

       为了让搜索引擎收录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务

       网站换新域名后,让旧的域名调整到新的域名上

       根据特殊变量、目录、客户端的信息进行URL跳转

    展开全文
  • rewrite详解

    千次阅读 2019-10-12 13:30:32
    rewrite模块 URI跟URL介绍 什么是uri?统一标识符,拿www.abc.com/aw/wd/举例,那么rui就是/aw/wd/这部分数据(也有可能是图片,html网页,如果是伪静态的话,那就得看配置是啥玩意了 什么是url? 统一定位符,还是...

    rewrite模块

            URI跟URL介绍
            什么是uri?统一标识符,拿www.abc.com/aw/wd/举例,那么rui就是/aw/wd/这部分数据(也有可能是图片,html网页,如果是伪静态的话,那就得看配置是啥玩意了
            什么是url?  统一定位符,还是拿www.abc.com/aw/wd/举例,那么整个www.abc.com/aw/wd/就是url        

            什么是rewrite?
            rewrite重写是由ngx_http_rewrite_module模块提供,主要是实现URI改写功能,并且此模块是Nginx默认安装的模块。通过rewrite,用户可以实现url重定向,根据regex规则来匹配内容跳转到replacement,结尾以flag标记。


            工作方式
            rewrite匹配默认是按照从上至下的顺序进行匹配,如果没有添加flag参数,直到把最后一个rewrite匹配完才终止,如果最后一个都没有匹配到内容则返回500,如果想要提前终止就得flag参数来帮忙实现。


           rewrite模块常见指令

    if (条件) {} #设定条件,再进行重写
           set     #后面+值,可以给变量赋值
           return  #返回状态码信息,并且支持自定义信息
           rewrite #重写 (这个是重点)
           rewrite_log # rewrite日志

          语法
            rewrite regex(正则) replacement(替换)  flag(标识);中间以空格隔开

          常用正则

    ^     以什么开头                                          
    $     以什么结尾 
    *     匹配前面的字符0次或者多次               
    +     匹配前面的字符1次或者多次 
    ?     匹配前面字符0次或者1次                     
    .     匹配除“\n \t”之外的单个字符
    
    (patten) 匹配括号内的patten(同时第一个() 就是$1 第二个是$2,$取值以()为分隔符)
    [a-z0-9] 匹配里面的任意单个字符,区分大小写    
                
    d      匹配任意数字
    \S     匹配可见字符                                        
    \s     匹配不可见字符
    \w     匹配任意单词(可以是单个字符,字符串等等) ac bh ki js n r          
    x|y    匹配x或则匹配y(任意一个) | 或 
    \W     匹配任意符号(可以是单个,也可以是多个) ? \ + - == [ ] { } -- ()  

          flag参数
            last        结束当前所有rewrite指令,并且使用新的URI直接进行location匹配。
            break    结束当前所有rewrite指令,不参与任何匹配,并且把当前输出作为结果返回给用户,避免重复rewrite。
            注:在server模块匹配中使用last,而在location功能模块中使用break
            redirect(临时)   返回302临时重定向
            permanent(永久的)  永久返回301重定向 
           注:301跟302跳转输出结果是一样的,但是主要是针对搜索引擎的,搜索引擎看见你的数据是302跳转,默认是不抓取的,301是抓取的,具体原因的话,那就不清楚了,在生产环境中,一般是301用的多


        例子:      

            last   结束当前所有rewrite指令,并且使用新的RUI进行下轮location匹配(但是匹配是有范围的,只匹配location的内容,上限是10次,10次没有匹配到内容,则返回500 ,容易造成死循环)。如果新的RUI是资源地址,则直接返回资源地址。
            break    结束当前所有rewrite指令,不参与任何匹配(包括后续rewrite,其它location),并且把当前URI用来处理用户请求,可以避免重复rewrite。

    示例1:last与break大致区别

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
       location ~ /break/ {
            rewrite /break/(.*) /test/$1 break; 
            return 200 jfnginx;
        }
    
        location ~ /last/ {
            rewrite /last/(.*) /test/$1 last;
            return 200  "last";
        }
    
        location ~ /test/ {
            rewrite /test/ /a.html;
        }
    
    } 

    注:根据break的特性,404是意料之中,return也是rewrite功能模块指令。

    注:这个结果也是意料之中,根据last的特性,把/last 替换成 /test又开始了新一轮的location匹配,匹配到/test的内容取得具体资源地址,返回给用户

    示例2:在server字段填写break,last与不填的区别

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        rewrite /break /downlod/wget-log last;
        rewrite /break /downlod/wget-log.1;
    
        location ~ /break/ {
            rewrite /break/(.*) /downlod/jfnginx.txt break;
        }
    
    }

    注:经过反复测试在server字段的第一个rewrite重写规则只要指定具体RUI资源,那么就会返回当前资源,无论后面加不加参数都不会执行其他的rewrite指令及匹配location功能模块。

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        rewrite /break /downlod/ break;
        rewrite /break /user/;
    
        location ~ /downlod/ {
            rewrite /downlod/(.*) /downlod/jfnginx.txt break;
        }
    
        location ~ /user/ {
            rewrite /user/(.*) /user/706342.html break;
        }
    
    }
    
    # curl ab.text.com/break/9289897df.html
    jfnginx

    注:经过3次测试(分别flag位置的参数设置为last,break,空),当server字段的rewrite的RUI指定是一个目录的时候,无论是后面有没有flag参数,都会根据RUI跳转,去匹配location功能模块,返回固定值。(一般在server字段需要强制跳转大部分是用permanent去处理)

    示例3:在location功能模块测试breakt填写位置不同的结果展示

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        location ~ /break/ {
            rewrite /break/(.*) /downlod/ brake;
        }
    
        location ~ /downlod/ {
            rewrite /downlod/(.*) /user/706342.html break;
        }
    
    }
    
    # curl ab.text.com/break/923us2u.html
    <html>
    <head><title>403 Forbidden</title></head>
    <body bgcolor="white">
    <center><h1>403 Forbidden</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>
    ##################################################################
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        location ~ /break/ {
            rewrite /break/(.*) /downlod/;
            break;
        }
    
        location ~ /downlod/ {
            rewrite /downlod/(.*) /user/706342.html break;
        }
    
    }
    
    # curl ab.text.com/break/9222ee2u.html
    <html>
    <head><title>403 Forbidden</title></head>
    <body bgcolor="white">
    <center><h1>403 Forbidden</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>
    
    ###################################################################
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        location ~ /break/ {
            rewrite /break/(.*) /downlod/ break;
            return 200 "jfnginx \n";
        }
    
        location ~ /downlod/ {
            rewrite /downlod/(.*) /user/706342.html break;
        }
    
    }
    
    # curl ab.text.com/break/9222ee22wewu.html
    <html>
    <head><title>403 Forbidden</title></head>
    <body bgcolor="white">
    <center><h1>403 Forbidden</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>
    

    注:根据上面的测试结果 break 是结束当前rewrite重写,无论后面还有没有rewrite或者是其它location模块都不匹配。last就不测试了,在示例1里面就有展示。

            redirect(临时)   返回302临时重定向

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        location ~ / {
            rewrite ^/bc http://ab.text.com/b.html redirect;
        }
    


        permanent(永久的)  永久返回301重定向 

    示例:
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        location ~ / {
            rewrite ^/ac http://ab.text.com/a.html permanent;
        }
    

    #跳转成功,但是做301或者302跳转的时候后面的内容一定要加协议,不然会把你跳转的内容当成一个文件去处理。301及301跳转是跳转至全新的内容,对访问方式以及就行了修改。

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
        rewrite_log on;
    
        location ~ ^/downlod/ {
            rewrite ^/downlod /downlod/jfnginx.txt;
            return 200 "jfnginx \n";
        }
    

    return  #用于返回状态码信息,并且支持自定义信息了,并且return还有终止rewrite的作用

    语法:
        return code [描述信息]; 示例:return 403;
        return code URL;    示例:return 301 https://ab.test.com/s/;
        return URL;         示例:return  https://ab.test.com/s/;
    
    
    返回常见状态码:
    403 
    404
    444    #比较特殊的状态码,返回这个的话,客户端是看不到状态码的。
    301
    302
    及其他自定义状态码
    
    
    示例:
        server {
            listen 80;
            server_name ab.text.com;
            index index1.html;
            root /data/www;
    
            location ~ /break/ {
                rewrite /break/(.*) /downlod/;
                return 200 "jfnginx \n";
            }
    
            location ~ /downlod/ {
                rewrite /downlod/(.*) /user/706342.html break;
            }
    
        }
    
    
        # curl ab.text.com/break/9222ee22wewu.html
        jfnginx 

    注:根据上述结果测试,return跟break功能是差不多的,但是return可以接返回码及描述信息(此码与http协议码还是有区别的,这个码是属于自定义的)

    error_page 返回错误

    error_page指令是一个错误处理指令,核心功能就是多错误进行处理.
    语法:error_page code ..[=[response]] uri;
    
    示例:
        error_page 404 /404.html;    #只要是产生404就调整到 404.html,同时会继承404的状态码
        error_page 500 502 503 504 /50x.html;    #只要是 500,502,503,504报错就调整到 50x.html
        error_page 404 = /test/;    #只要是404就跳转到 /test/,此时返回状态码会修改为 200
        error_page 404 = /404.php   #只要是404就调转到 404.php,此时返回的状态为 200
        error_page 403 http://example.com/forbideen.html;    #只要是403就调整到固定页面
        error_page 404 = 301 http://example.com/example.html    #只要是404就跳转到后面地址,状态码为301
    
        注:有个说明就是 error_page 后面加不加等号区别就是:加等会,返回的状态码自动改为 200,不加就继承上次的状态,比如403,404等状态都会被继承
    
    小干货:
    在有的生产环境,你通过error_page做了404或者500等跳转,结果发现没有跳转,你不仿在当前server块开启如下指令:
        proxy_intercept_errors on;  #它会主动获取错误信息,使你的error_page跳转生效
    

    if (条件) {}   #设定条件,再进行重写

    语法:if (condition){...} 如果condition为真,则执行{...}的内容,condition有以下3种情况:
    
    当条件为变量(自定义变量或系统变量)时,值为空或者任何以0开头的字符串都被当做flase.
    直接比较变量值的时候用 = 或 !=
    ~ 为正则匹配 ~*不区分大小写匹配 !~区分大小写的不匹配
    -e -f -d -x 跟正则的里面的是一个意思 加 ! 非的意思 也就是 不等于
    
    
    # $request_filename指的是请问资源路劲, !-e 代表不存在
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
       if ( !-e $request_filename ) {
           rewrite (.*) /a.html;
       }
    }
    注:当请求的资源不存在的时候,全部转到a页面
    
    # curl ab.text.com/break/9222ee22wewu.html
    #这是a页面
    是不是很意外?是不是很惊喜?这就是我的a页面。
        <!--引入b.html-->
        <!--# include file="b.html" -->
    
    其它例子:
        #做防盗链,如果referer为空就禁止访问,注意if不支持逻辑或与逻辑与,需要多个逻辑判断得多个if组合一起
        if ($http_referer "") {
            return 403;    
        }

    try-files 主要对没有匹配到的数据进行处理

    语法:
    try_files file ... uri;
    try_files file ... =code;
    适用字段:server, location
    注:try_files 最后面是可以接uri或者源码的。
    
    示例:
    try_files $uri $rui/ =403;  
    try_files $uri $rui/ /a.html;
    try_files $uri $rui/ @user;    
    #对进行域名访问的请求进行匹配,如果server没有数据则强制返回404。
    #其中前2个$uri是匹配内部数据,只有最后那个参数才起到重定向的功能
    
    #综合配置
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        try_files $uri @user;
    
        location  @user{
            rewrite ^(.*) /a.html break;
        }
    }
    
    示例1:ssd.html文件并不存在
    # curl ab.text.com/ssd.html            #访问结果直接跳转到a页面
    #这是a页面
    是不是很意外?是不是很惊喜?这就是我的a页面。
        <!--引入b.html-->
        <!--# include file="b.html" -->
    
    示例2:ssdj.html 存在在根目录之下
    # echo ssdj > ssdj.html
    # ls
    404.html  a.html  b.html  downlod  index1.html  ssdj.html  user
    # curl ab.text.com/ssdj.html        #返回是当前页面的值
    ssd

    set指令 定义一个变量,并给变量赋值。变量的值可以为文本、变量或者变量的组合。set $var "hello world"  

    使用环境:server,location,if 

    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
       if ( !-e $request_filename ) {
           rewrite (.*) /downlod;
           set $ac "2200 \n";
           return 200 $ac;
       }
    }
    
    
    # curl ab.text.com/ssdsd
    2200 
    
    比如我需要做防盗链,只要ua(user-agent)为"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"及referer为空的请求禁止访问。
    
    server {
        listen 80;
        server_name ab.text.com;
        index index1.html;
        root /data/www;
    
        set $p 0;    #设置变量p,值为0
        if ($http_user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"){
            set ${p}1;    #如果上面的if执行成功,则再次设置变量p值为01,因为${p}是继承了上面那个$p的值。
        }
    
        if ($http_referer = ""){
            set ${p}2;    #如果上面的if执行成功,就再次赋值,此时p的值为012,${p}继承的是01,然后组合起来是012
        }
    
        if ($p = 012 ){
            return 403;    #最终判断,如果p的值为012,在代表上面的条件都匹配,我们就返回403
        }
           
    }
    
    #因为Nginx的if不支持逻辑或跟逻辑与,我们只能通过对变量赋值的方式,对用户的请求进行判断,如果符合要求则赋值,最终根据值进行判断是否返回403。
    #当然上面的只是示例,比如还有做各种挑战的,rewrite啥的
    

    常用变量:

    $args:这个变量等于请求行中的参数,同$query_string
    $request_filename:请求资源路劲 
    $uri:不带请求参数的当前URI,$uri不包含主机名,如”/html/abc.html”
    $host:请求主机头字段,否则为服务器名称。

    Nginx大部分支持的变量:http://nginx.org/en/docs/varindex.html
     

    展开全文
  • 上一节 《rewrite阶段的rewrite模块:return指令》 中,提到了rewrite阶段的rewrite模块提供的两个指令:return指令 和 error_page指令,用于做重定向及一些简单的返回。 除此之外,rewrite模块还提供了 rewrite指令...
  • #rewrite ^/([a-z-A-Z]+)/?$ /index2.html?namespace=user last; #} location / { rewrite 555.html newest333.html break; ssi on; ssi_silent_errors off; #ssi_types text/html; ...
  • nginx rewrite

    2019-02-11 14:07:57
    参数 正则表达式匹配,其中: ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: ...last 相当于Apache里的[L]标记,表示完成rewrite brea...
  • nginx rewrite 跨域

    2020-07-22 14:44:28
    1.rewrite指令 rewrite 指令语法: rewrite regex replacement [flag]; 作用域:server 、location、if 功能:如果一个URI匹配指定的正则表达式regex,URI就按照 replacement 重写。 rewrite 按配置文件中出现的...
  • Rewrite程序端

    2010-08-31 19:47:06
    Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端
  • 如果在安装目录下的modules目录里有mod_rewrite.so,则在/conf/httpd.conf文件中加入 LoadModule rewrite_module modules/mod_rewrite.so 如果在安装目录下的modules目录里没有mod_rewrite.so,在apache源码包...
  • nginx 中配置rewrite跳转 Rewrite跳转场景 Rewrite跳转场景主要包括以下几种 1)可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求, 2)为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL...
  • Nginx rewrite模块配置

    2020-08-12 19:19:35
    文章目录一、Rewrite简介1.1Rewrite跳转场景1.2Rewrite跳转实现1.3Rewrite实际场景1.4Nginx正则表达式二、Rewrite命令2.1Rewrite命令语法2.2flag标记说明三、location3.1location优先级3.2比较rewrite和location四、...
  • nginx 的 rewrite

    2020-10-01 15:55:00
    其实nginx的rewrite模块是在日常nginx配置中十分常用的模块,应该是除了 real_ip 模块、匹配时用到的find_config模块和前端资源配置的 static 模块外的最常用的了吧。 Nginx的处理顺序 nginx的处理顺序是11 个模块...
  • URL 静态化可以提高搜索引擎抓取,开启本功能需要对 Web 服务器增加相应的 Rewrite 规则,且会轻微增加服务器负担。本教程讲解如何在 IIS 环境下配置各个产品的 Rewrite 规则。 一、首先下载 Rewrite.zip 的包,解压...
  • Rewrite重写概述

    2020-01-17 19:55:29
    rewrite主要实现url地址重写,以及url地址跳转. Rewrite重写相关模块 set 设置变量 if 判断 return 返回字符串 返回状态码 返回url地址 rewrite 重定向url rewrite匹配规则 last — 本条location匹配到后终止,将匹配...
  • 使用 Apache 启用与设置 Rewrite 很容易实现,我们这里就不多说了,现在介绍一下如何在 IIS 下添加和配置 Rewrite 组件: IIS Rewrite 下载 Rewrite.dll下载 IIS Rewrite 配置 1、将下载的 rewrite.zip解压,放...
  • url rewrite

    2014-07-01 16:58:00
    http://www.microsoft.com/taiwan/technet/iis/expand/URLRewrite.aspx http://www.iis.net/learn/extensions/url-rewrite-module ...
  • WordPress URL rewrite

    2018-01-08 11:23:40
    通过添加URL rewrite 规则到rewrite_rules_array数组里,(rewrite_rules_array数组存放wordpress 重写规则) 刷新重写规则,使之生效,若以上两步不好用,看看查询过滤。 1.通过get_post()找到你想设置到目的URL...
  • Nginx REWRITE阶段

    2019-02-12 17:32:00
    rewrite_log on ;#每次rewrite都会记录一条记录在errorlog里 error_log logs/xxx.log notice; location /first { rewrite /first(.*) /second$1 last; #表示重新开始匹配location rewrite 第一个参数 /f...
  • ubuntu rewrite

    2014-08-19 14:11:01
    sudo a2enmod rewrite
  • 文章目录简介rewrite 举例重写响应体中参数重写请求体中参数给请求添加请求头添加 Query 参数 简介 支持重写的元素有,包含了请求头和请求提 header host url path query param response status body rewrite 入口...
  • nginx rewrite 语法

    2018-05-07 15:37:57
    Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:rewrite ^/b/(.*)\.html /play.php?video=$1 break...
  • ThinkPHP 设置rewrite

    2019-07-25 16:45:39
    今天安装了一下ThinkCMF5遇到一个设置rewrite的问题,(服务器rewrite) 工具:phpstudy->nginx 方法:在配置文件中添加 if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s=$1; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,356
精华内容 65,342
关键字:

rewrite