zoukankan      html  css  js  c++  java
  • 4.Nginx的URL重写应用

    NginxURL重写应用

             nginx的URL重写模块是用得比较多的模块之一,所以我们需要好好地掌握运用。常用的URL重写模块命令有if,rewrite,set,break等。

    1. if命令

    if用于判断一个条件,如果条件成考,则执行后面大括号内的语句,相关配置从上级继承。if命令的使用方法如下:

    语法:if(condition) {….}                                                                      # condition:条件

    默认值:none

    使用字段:server,location

    默认情况下,if命令值为null,可在Nginx配置文件的server,location部分使用,另外,

    if命令可以在判断语句中指定正则表达式或匹配条件,相关匹配条件如下:

    正则表达式匹配:

    • ~表示区分大小写匹配
    • ~*表示不区分大小写匹配
    • !~和!~*表示上面2种不匹配

    文件及目录匹配:

    • -f和!-f用来判断是否存在文件
    • -d和!-d用来判断是否存在目录
    • -e和!-e用来判断是否存在文件或目录
    • -x和!-x用来判断文件是否可执行

    Nginx配置文件中有很多内置变量,这些变量经常和if命令一起使用。常见的内置变量

    有如下几种:

    • $args:此变量与请求行中的参数相等。
    • $document_root:此变量等同于当前请求的root命令指定的值。
    • $uri:此变量等同于当前request中的URI。
    • $document_uri:此变量与$uri含义一样。
    • $host:此变量与请求头部中“Host”行定义的值一致。
    • $limit_rate:此变量用来设置限制连接的速率。
    • $request_method:此变量等同于request的method,通常是“GET”或“POST”。
    • $remote_addr:此变量表示客户端的ip地址。
    • $remote_post:此变量表示客户端端口。
    • $remote_user:此变量等同于用户名。由 ngx_http_auth_basic_module模块认证。
    • $request_filename:此变量表示当前请求的文件的路径名,由root或alias与URI request组合而成。
    • $request_uri:此变量表示含有参数的完整的初始URI。
    • $query_string:此变量与$args含义一致。
    • $server_name:此变量表示请求到达的服务器名。
    • $server_port:此变量表示请求请求到达的服务器端口号。

    在了解相关的if命令规则和Nginx内置变量后,下面给出一个server配置段实例:

    server {

    listen       80;

    server_name  www.gxl.com;

                 location / {

            root   html;

            index  index.html index.htm index.php;

    }

    location ~ .(gif|jpg|jpeg|png|bmp|swf)$ {

                root           html;

                expires 30d;

                                if ( !-f $request_filename )

                                {

                                         root /var/www/html

                                }

    if ( !-f $request_filename )

                                {

                                         root /emp

                                }                

            }

             location ~ .(jsp|jspx|do)$ {

                root html;

    proxy_set_header Host $host;

                proxy_set_header X-Forwarded-For $remote_addr;

                proxy_pass http://127.0.0.1:8080;

                                if ( !-f $request_filename )

                                {

                                         root /var/www/html

                                }

    }

    }

    当我们访问以gif结尾的文件的时候,我们先在root定义的目录下查找,然后再在下面依次的目录查找。

     

    1. rewrite命令

    nginx通过ngx_http_rewrite_module模块支持URL重写和if条件判断,但要使用rewrite功能,需要pcre支持,应在编辑nginx时指定pcre源码目录。rewrite的使用语法如下:

    语法:rewrite regex flag

    默认值:none

    使用字段:server,location,if

    在默认情况下,rewrite命令默认值为空,可在nginx配置文件的server,location,if部分使用,rewrite命令的最后一项参数为flag标记,其支持的flag标记主要有以下几种。

             last:相当于Apache里的[L]标记,表示完成rewrite之后搜索相应的URL或location。

             break:表示终止匹配,不在匹配后面的规则。

             redirect:将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。

             permanent:将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址。

             其中,last和break用来实现URL重写,浏览器地址栏中的URL地址不变。下面是一个示例配置:

                 location ~ ^/best/ {

            rewrite ^/best/(.*)$ /test/$1 break;

            proxy_pass http://www.fjp.com;

            }

             这个例子使用了break标记,可以实现将请求http://www.gxl.com/best/index.html的页面重定向到http://www.fjp.com/test/index.html页面,而不引起浏览器地址栏中URL的变化。这个功能在新旧网站交替的时候非常有用。

     

    1. set命令

    通过set命令可以设置一个变量并为其赋值,其值可以是文本,变量,或他们的组合。也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部的值。

    set使用语法如下:

    语法:set variable value

    默认值:none

    使用字段:server,location,if

    在默认情况下,set命令默认值为空,可在nginx配置文件的server,location,if部分使用,下面是一个示例配置:

     location / {

          root   html;

          index  index.html index.htm index.php;

          proxy_cache cache_one;

          proxy_cache_valid 200 304 12h;

          proxy_cache_key $host$uri$is_args$args;

    #     proxy_pass http://127.0.0.1:8080;

          set $query $query_string;

          rewrite /dede /wordpress?$query?;

         }

    在这个例子中,要实现将请求为http://www.tb.com/dede/?p=160的页面重写到地址http://www.tb.com/wordpress/?p=160,也就是重写带参数的URL。这里涉及$query_string变量,这个变量相当于请求行中的参数,也就是?后面的内容,也可以用$args代替$query_string变量。

     

    1. breadk命令

    break的用法在前面的介绍中其实已经出现过,他表示完成当前设置的规则后,不再匹配后面的重写规则。break的使用语法如下:

    语法:break

    默认值:none

    使用字段:server,location,if

    在默认情况下,break命令的值为空,可在nginx配置文件的server,location,if部分使用,下面事一个应用实例:

    server {

        listen       80;

        server_name  www.gxl.com www.fjp.com;

        if ( $host != 'www.fjp.com' ) {

        rewrite ^/(.*)$ http://www.fjp.com/error.txt break;

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

            }

       }

    这个例子中定义了两个域名,当通过www.gxl.com访问网站时,会将请求重定向到http://www.fjp.com/error.tx页面,而通过www.fjp.com能够正常访问,而且由于上一句设置了break命令,因此下面的rewrite规则不在执行,直接退出。

     

    每天学习一点点,重在积累!
  • 相关阅读:
    windows服务启动有界面的程序
    [转发]读取txt防止读到乱码--自动根据文件编码进行读取
    线程UI同步
    SQL2012导出的脚本没有if exists判断
    power designer 设计数据库生成到oracle数据库
    经典三层,单元工作模式出错的解决方案
    EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
    Oracle 11g 客户端连接 oracle 10g 服务端,乱码问题
    EF 连接oracle 基础连接失败 问题解决
    vs2010 oraclelient 引用问题
  • 原文地址:https://www.cnblogs.com/GXLo/p/5169093.html
Copyright © 2011-2022 走看看