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

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

[复制链接]

尚未签到

发表于 2018-11-9 10:41:47 | 显示全部楼层 |阅读模式
  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重写的几个例子,仅供参考!



运维网声明 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.iyunv.com/thread-632751-1-1.html 上篇帖子: Nginx+Php+Discuz配置 下篇帖子: Nginx配合keepalived实现双主负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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