设为首页 收藏本站
查看: 1220|回复: 0

[经验分享] Nginx高性能web服务器之URL重写(五)

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-4-13 08:21:23 | 显示全部楼层 |阅读模式
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配置段例子:
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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地址不变,下面是一个实例配置:
1
2
3
4
   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部分使用,下面是一个配置例子:
1
2
3
4
5
    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部分使用。下面是一个配置实例:
1
2
3
4
5
6
7
8
9
10
     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和[url]www.b.com[/url] 当通过域名www.a.com访问网站时,会将请求重定向到http://www.a.com/error.txt的页面。由于设置了break命令,所以下面的rewrite就不会再执行,直接退出!


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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-56451-1-1.html 上篇帖子: Nginx高性能web服务器之配置文件(三) 下篇帖子: Nginx高性能web服务器之缓存服务器(六) web服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表