Nginx重写功能(rewrite与location)(二)

本文涉及的产品
.cn 域名,1个 12个月
简介: Nginx重写功能(rewrite与location)(二)

三 访问重新rewrite


3.1 rewrite 概述

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向


rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用


例如:


http://www.lhq.com/a/gyq/index.php?id=1&u=str 只对/a/gyq/index.php 部分重写


3.2 rewrite 跳转实现

Nginx: 通过 ngx_http_rewrite_module 模块支持URL重写,支持 if 判断,但是不支持else


跳转: 从一个 location 跳转到 另一个location ,循环最多可以执行10次。超出后,返回nginx 500 错误


PCRE 支持: perl 兼容正则表达式的语法规则匹配


重写模块 set 指令: 创建新的变量,并设其值


3.3 rewrite 执行顺序如下:

(1) 执行 server 块里面的 rewrite 指令


(2) 执行 location 匹配


(3) 执行选定的 location 中的 rewrite 指令


语法: rewrite [flag];


regex :表示正则匹配规则


replacement :表示跳转后的内容


flag :表示 rewrite 支持的 flag 标记


flag标记说明


last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中


break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中


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


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


四 rewrite 示例


4.1 基于域名的跳转

应用场景:现在公司旧域名www.benet.com有业务需求变更,需要使用新域名www.stevelu.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。


4.1.1 配置域名跳转

复制vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.benet.com;  #设置域名
        charset utf-8;
        access_log  logs/benet.access.log ;   #设置日志路径
        location  / {
            if ($host = 'www.benet.com') {   #变量host 为rewrite 的全局变量,代表请求头字段或者主机名
                rewrite ^/(.*)$   http://www.stevelu.com/$1  permanent;  #$1 为正则匹配之后的内容,即 “www.benet.com/" 后面的字符串
            }
            root   html;
            index  index.html index.htm;
        }
        .......
    }


4.1.2 访问测试

echo '192.168.109.131  www.benet.com   www.mynet.com'  >> /etc/hosts
 #注意,网页文件应该放在 /usr/local/nginx/html/目录中
 echo '<h1> hello </h1>'  > /usr/local/nginx/html/index.html
 /usr/local/nginx  -s reload 
 firefox  http://www.benet.com


4.2 基于客户端IP 访问跳转

应用场景


要求:今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.109.131 访问正常


4.2.1 修改配置文件,实现 ip 访问跳转

复制 vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/benet.access.log ;
       #设置是否合法的IP 标记
        set $rewrite true;  #设置变量rewrite,变量值为boole 值,true
        #判断是否合法的IP 标记
        if  ($remote_addr = "192.168.109.131" ) {
            set $rewrite false;        #当客户端的ip 为 192.168.23.104,将变量值设置为false,不进行重写
        }
       #除了  192.168.109.131,其他的iP 都是非法ip,进行重写跳转到 维护界面
       if  ($rewrite = true) {   #变量值为true 时,进行重写
            rewrite (.+) /weihu.html;   #将域名后面的路径重写为 /weihu.html。这里不可以加上 permanent,否则会陷入死循环
        }
        # 设置网页www.benet.com/gyq.html 的内容
        location = /gyq.html {   
             root /var/www/html;    
        }
        location  / {
            root   html;
            index  index.html index.htm;
        }
     .......
}
   echo  "<h1> hello </h1>" > /usr/local/nginx/html/index.html
   mkdir -p /var/www/html/
   echo "<h1> gyq </h1>"   >  /var/www/html/index.html
   nginx -s reload  #重载 nginx 配置文件


4.2.2 访问测试

192.168.109.131 主机访问

echo "192.168.109.131 www.benet.com " >> /etc/hosts
firefox  http://www.benet.com


192.168.109.132 主机访问

复制echo "192.168.109.132 www.benet.com " >> /etc/hosts
firefox http://www.benet.com


4.3 基于旧域名跳转到新域名后面加目录(把原本域名的主机名变为现在的目录名

现在访问的是 http://bbs.benet.com/post,现在需要将这个域名下面的访问都跳转到http://www.benet.com/bbs/post


4.3.1修改配置文件

复制vim /usr/local/nginx/conf/ngixn.conf    
server {        
  listen       80;        
  server_name  bbs.benet.com;        
  charset utf-8;        
  access_log  
  logs/bbs.benet.access.log  main;        
  location  /test {            
  rewrite (.+)   http://www.betnet.com/bbs/$1  permanent;        
  }  #$1 表示位置变量,值是 /test        
  location / {            
  root   html;            
  index  index.html index.htm;        
  }       
  ...... 
}


4.3.2 访问测试

复制mkdir -p /usr/local/nginx/html/bbs/test
echo "this is 1.html" > /usr/local/nginx/html/bbs/test/1.html
echo "192.168.109.132 bbs.benet.com" >> /etc/hosts
nginx  -s reload
firefox http://bbs.benet.com/test/1.html


4.4 基于参数匹配跳转

访问http://www.benet.com/100-(100|200)-100.html 跳转到http://www.benet.com页面


4.4.1 修改配置文件

复制vim /usr/localnginx/conf/nginx.conf
 server {
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/www.benet.access.log ;
        if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {  #uri为 完整的url除去$host部分. \d 表示匹配数字。
                rewrite (.+) http://www.benet.com permanent;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
       .....
  }
#$request_uri: 包含请求参数的原始URI,不包含主机名,如: http://www.kgc.com/abc/bbs/index.html?a=1&b=2中的/abc/bbs/index.php?a=1&b=2
#$$uri:这个变量指当前的请求URI,不包括任何参数,如: /abc/bbs/index.html
#$document_uri: 与$uri相同, 这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html


4.4.2 访问测试

复制firefox http;//www.benet.com/1oo-200-100.html

4.5 基于目录下所有的php 结尾的文件跳转

要求访问 http://www.benet.com/upload/123.php 跳转到首页。


4.5.1 修改配置文件

复制 vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/www.benet.access.log ;
  #将/upload/路径后面,所有.php 结尾的转发
        location ~* /upload/.*\.php$ {    
             rewrite (.+)  http://www.benet.com permanent;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        .....
   }

4.5.2 访问测试

复制nginx -s  reload 
firefox http://www.benet.com/upload/123.php

4.6 基于最普通一条 URL 请求的跳转

要求访问一个具体的页面如 http://www.benet.com/abc/888.html 跳转到首页

4.6.1 修改配置文件

复制vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/www.benet.access.log ;
        location ~*  ^/abc/123.html {    
             rewrite (.+)  http://www.benet.com permanent;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        ......
     }


4.6.2 测试

复制nginx -s reload
firefox http://www.benet.com/abc/123.html


4.7 rewrite 总结

location 用于匹配 用户访问请求的URL ,来使用哪一个目录中的网页资源,


rewrite … permanent 修改url 后再次请求访问


rewrite /weihu.html 按照修改域名后的 url 直接跳转到对应的 location


location ~ … if ($request_uri) {


rewrite 如果对全URL 重写,则重写部分就以http:// 开头,后面跟上重写后的URL。 http://…


如果不以http://… 开始重写, 默认只对于域名后的路径重写,对 ?后传递的参数无效如http://www.benet.com/abc/?.. ,则只 对 " abc" 进行重写


}

目录
相关文章
|
1月前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
3月前
|
负载均衡 应用服务中间件 API
Nginx:location配置模块的用法(一)
Nginx:location配置模块的用法(一)
479 2
|
4月前
|
应用服务中间件 nginx
Nginx Location 深入剖析及动静分离简易配置
Nginx Location 深入剖析及动静分离简易配置
73 3
|
1月前
|
存储 缓存 前端开发
理清 nginx 中的 location 配置
理清 nginx 中的 location 配置
|
1月前
|
应用服务中间件 nginx
nginx location指令详解
nginx location指令详解
|
1月前
|
负载均衡 安全 应用服务中间件
nginx的强大功能和如何使用?
nginx的强大功能和如何使用?
62 2
|
3月前
|
搜索推荐 Java 应用服务中间件
Nginx Rewrite 规则
【8月更文挑战第21天】Nginx Rewrite 规则
38 2
|
3月前
|
缓存 前端开发 应用服务中间件
Nginx:location配置模块的用法(二)
Nginx:location配置模块的用法(二)
153 2
|
3月前
|
运维 算法 应用服务中间件
运维系列.Nginx中使用HTTP压缩功能(一)
运维系列.Nginx中使用HTTP压缩功能(一)
69 1
|
3月前
|
运维 应用服务中间件 网络安全
运维系列.Nginx配置文件结构功能总结
运维系列.Nginx配置文件结构功能总结
67 0
运维系列.Nginx配置文件结构功能总结