Nginx高性能web服务器之URL重写(五)

    Nginx的URL重写模块用的很多。常用的URL重写模块命令有if,rewrite,set,break等。

一、if命令

if命令的使用方法如下:

  语法:if(condition){...}

  默认值:none

  使用字段:server,location

  默认情况下,if命令默认值为空,可以在Nginx配置文件的server,location部分使用,if命令还可以在判断语句中指定正则表达式或者匹配条件等。

正则表达式匹配:

    ~:表示区分大小写匹配

    ~*:表示不区分大小写匹配

    !~和!~*分别表示区分大小写不匹配和不区分大小写不匹配

文件和目录匹配:

    -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_port:表示客户端端口

    $remote_user:表示用户名,由ngx_http_auth_basic_module认证

    $request_filename:表示当前请求的文件路径名,由root或alais与URI request组成

    $request_uri:表示含含有参数的完整初始URI

    $request_string:与$args一样

    $server_name:请求到达的服务器名

    $server_port:请求到达的服务器端口号


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

   

server {
        listen       80;
        server_name  www.a.com;
        access_log  logs/host.access.log  main;
location / {
            root   /var/www/html;
            index  index.html index.htm;
        }
location ~.*\(htm|html|gif|jpg|jpeg|png|bmp|swf|js|css)$ {
        root /usr/local/nginx/www/img;
        if (! -f $request_filename)
        {
         root /var/www/html/img;
        }
        if (! -f $request_filename)
        {
        root /apps/images;
        } 
  }
location ~.*\. (jsp)${
         root /webdata/webapp/www/ROOT;
         if (! -f $request_filename)
         {
         root /usr/local/nginx/www/jsp;
         } 
         proxy_pass http://127.0.0.1:8888;
      
      }
  
}

这段代码主要完成对www.a.com这个域名的资源访问设置。www.a.com这个域名的根目录为"/var/www/html"。

   静态资源分别位于"/usr/local/nginx/www/img"、"/var/www/html/img"、"/apps/images"这三个目录下面。请求静态资源的方式是依次从这三个目录下面查找。如果第一个目录不存在的话,就去找第二个目录。以此类推,如都找不到的话,就返回404错误。

    动态资源分别位于"/webdata/webapp/www/ROOT"和"/usr/local/nginx/www/jsp"两个目录下面。如果客户端请求的资源是以jsp结尾的文件,那么依次在这两个动态程序目录中查找资源。如果没有在这两个目录中定义的资源,那么将在从根目录"/var/www/html"中进行查找。


     

二、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之后搜索相应的URI或location

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

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

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

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

   location ~ ^/best/ { 
   rewrite ^/best/(.*) /test/$1 break;
   proxy_pass http://www.a.com;
 }


这个例子用了break标记,可以实现将请求http://www.a.com/best/webinfo.html的页面重定向到

http://www.b.com/test/webinfo.html页面而不引起浏览器地址栏中的URL变化。这个功能在新旧网站交替的时候非常有用。


三、set命令

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

    set的使用方法如下:

    语法:set variable value

    默认值:none

    使用字段:server location if

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

    location / {
    proxy_pass http://127.0.0.1:8080/; 
    set $query $query_string;
    rewrite /dede /wordpress?$query?;
    }

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

四、break命令

break表示完成当前的设置规则后,不再匹配后面的重写规则。

      break的使用方法如下:

      语法:break

      默认值:none

      使用字段:server location if

在默认情况下,break的命令值也是空的。可以在Nginx的配置文件的server location if部分使用。下面是一个配置实例:

     server {
     listen 80;
     server_name www.a.com www.b.com;
     if ($host != ‘www.a.com’) 
     {
     rewrite ^/(.*)$ http://www.a.com/error.txt; 
     break;
     rewrite ^/(.*)$ http://www.a.com/$1 permanent;
      }
}

这个例子定义了两个域名www.a.com和www.b.com 当通过域名www.a.com访问网站时,会将请求重定向到http://www.a.com/error.txt的页面。由于设置了break命令,所以下面的rewrite就不会再执行,直接退出!

   


好了,以上就是一些关于URL重写的几个例子,仅供参考!

你可能感兴趣的:(linux,nginx,shell)