• rewrit的项目心得与总结


    一、rewrite跳转场景

    1.1、URL看起来更规范、合理

    1.2、企业会将动态URL地址伪装成静态地址提供服务

    1.3、网站换新域名后,让旧的访问跳转到新的域名上

    1.4、服务端某些业务调整

    二、rewrite的跳转实现

     三、rewrite的实现场景

    1、Nginx跳转需求的实现方式

    2、使用rewrite进行匹配跳转

    3、使用if匹配全局变量后跳转

    4、使用location匹配再跳转

    5、rewrite放在server{},if{},location{}段中

    6、location只对域名后边的除去传递参数外的字符串起作用

    7、对域名或参数字符串

    8、使用if全局变量匹配

    9、使用proxy_pass反向代理

    四、rewrite命令

    1 rewrite <regex> <replacement> [flag];
    2 <regex>:正则表达式        
    3 <replacement>:跳转后的内容     
    4 [flag]rewrite支持的flag标记
    

      

    flag标记说明

    标记

    说明

    last

    相当于Apache的[L]标记,表示完成rewrite

    break

    本条规则匹配完成即终止,不再匹配后面的任何规则

    redirect

    返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url

    permanent

    返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url

    1)last:url重写后,马上发起一个新请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏不变

    2)break:url重写后,直接使用当前资源,不再使用location余下的语句,完成本次请求,地址栏不变

    总结:last和break再重定向后,地址栏都不会发生变化,这是他们的相同点,不同点在于last会写在server和if中,break是写在location中,last不会终止重写后的url匹配,break会终止重写后的url匹配

    五、location的分类

    1 location = patt{} [精准匹配]
    2 location patt {} [一般匹配]
    3 location ~ patt {} [正则匹配]
    

      

    正则匹配的常用表达式

    标记

    说明

    ~

    执行一个正则匹配,区分大小写

    ~*

    执行一个正则匹配,不区分大小写

    !~

    执行一个正则匹配,区分大小写不匹配

    !~*

    执行一个正则匹配,不区分大小写不匹配

    ^~

    普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他location

    =

    普通字符精确匹配,也就是完全匹配

    @

    定义一个命名的location,使用再内部定向时

    location的优先级

    相同类型的表达式,字符串长的会优先匹配

    按优先级排列

    1 = 类型
    2 ^~ 类型表达式
    3 正则表达式(~和~*)类型
    4 常规字符串匹配类型,按前缀匹配
    5 通用匹配(/),如果没有其他匹配,热河请求都会匹配到
    

    location优先级的示例

     1 location = / {                     ①精确匹配/,主机名后面不能带任何字符串
     2 [configuration A]
     3 }
     4 location ~ /documents/abc {        ②匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才会起作用
     5 [configuration B]
     6 }
     7 location /documents/ {             ③匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用
     8 [configuration C]
     9 }
    10 location / {                       ④所有的地址都以/开头,这条规则将匹配到所有请求,但正则表达式和最长字符会优先匹配
    11 [configuration D]
    12 }
    13location ^~ /images/ {             ①以/images/开头的地址,匹配符合后,停止往下匹配
     14[configuration E]
     15}
     16ocation ~* .(gif|jpg|jpeg)$ {    ②匹配所有以gif,jpg或jpeg结尾的请求,因为^~的优先级最高
     17[configuration F]
     18}
     19location ~ /images/abc {           ③以/images/abc开头的,优先级次之
     20[configuration G]
     21}
    22 location /images/abc/1.html {      ④如果和正则~ /images/abc/1.html相比,正则优先级最高
    23 [configuration H]
    24 }
    25 location /images/abc {             ⑤最长字符匹配到/images/abc,优先级最低
    26 [configuration I] 
    27 }
    

     六、对location和rewrite进行比较

    1、相同点:都能实现跳转

    2、不同点:rewrite是在同一个域名内更改获取资源的路径

                        location是对一类路径控制访问或反向代理,还可以proxy_pass到其他机器

    3、rewrite会写在location里,执行顺序

    ①、执行server快里面的rewrite指令

    ②、执行location匹配

    ③、执行选定的location中的rewrite指令

    4、location优先级规则

    匹配某个具体文件

    (location = 完整路径)>(location ^~ 完整路径)>(location ~* 完整路径)=(location ~ 完整路径)>(location /)

    用目录做匹配访问某个文件

    (location = 目录)>(location ^~ 目录)>(location ~* 目录)=(location ~ 目录)>(location /)

    六、实例说明

    1、基于域名的跳转

    公司的旧域名www.old.com 因为业务需求变更,需要使用新域名www.new.com代替

    不能废除旧域名

    从旧域名跳转到新域名,切保持其参数不变

    2、修改新站点配置文件(基于LNMP)

    vi /usr/local/nginx/conf/nginx.conf
    server {
            listen       80;
            server_name  www.old.com;
    
            charset utf-8;
    
            access_log  logs/host.access.log  main;
            if ($host = 'www.old.com')
            {
            rewrite ^/(.*)$ http://www.new.com/$1 permanent;
            }
            location / {
    
                root    /usr/local/share/html;
                index  index.html index.htm;
    

      检查nginx配置文件并重启nginx

    [root@server3 ~]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@server3 ~]# systemctl restart nginx

     创建新站点的网页,添加主机映射
    vi /etc/hosts
    20.0.0.30 www.old.com www.new.com
    
    [root@server3 ~]# mkdir -p /usr/local/share/html
    [root@server3 ~]# cd /usr/local/share/html/
    [root@server3 html]# vi index.html
    [root@server3 html]# vi /usr/local/nginx/conf/nginx.conf
    
    <html><body><h1>this is new</h1></body></html>
    

     客户端测试

     

     2、基于客户端IP访问跳转

    今天我们公司新业务版本上线。所有ip访问任何内容都会显示一个正在维护的页面,只有公司的ip才能正常访问,

    修改配置文件

    vi /usr/local/nginx/conf/nginx.conf
        server {
            listen       80;
            server_name  www.old.com;
           set $rewrite true;
           if ($remote_addr = "20.0.0.30"){
             set $rewrite false;
             }
             if ($rewrite = true){
                 rewrite (.+) /maintenance.html;
                }
             location = /maintenance.html {
                 root /usr/local/nginx/html;
           }
    

      检查配置文件,重启nginx

    nginx -t
    systemctl restart nginx
    

      

    修改重定向的网页

     vi /usr/local/nginx/html/maintenance.html
    <html><body><h1>website is maintaing,please visit later</h1></body></html>
    

      测试

     

     

     3、基于新域名,旧域名跳转并加目录

    修改配置文件

    vi /usr/local/nginx/conf/nginx.conf
     server {
            listen       80;
            server_name  www.old.com;
    
    
            charset utf-8;
    
            access_log  logs/host.access.log  main;
             location /post
             {
            rewrite (.+) http://www.new.com/bbs$1 permanent;
            }
    末尾添加
     server {
             listen       80;
             server_name  www.new.com;
    
             charset utf-8;
    
             access_log  logs/host.access.log  main;
             location /
              {
                  root /usr/local/share/html;
                  index   index.html index.htm;
             }
     }

    检查配置文件 并重启nginx

    nginx -t
    systemctl restart nginx

    创建BBS目录

     cd /usr/local/share/html/
     mkdir bbs
     mv index.html bbs/
     cd bbs/
     mkdir post
     mv index.html post 

    测试

     

     4、基于参数匹配的跳转

    修改配置文件

    vi /usr/local/nginx/conf/nginx.conf
    server {
            listen       80;
            server_name  www.old.com;
           if ($request_uri ~ ^/100-(100|200)-(d+).html$)
           {
              rewrite (.+) http://www.old.com permanent;
           }
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    

    j检查配置文件,重启nginx

    nginx -t
    systemctl restart nginx

     进行测试

     

  • 相关阅读:
    css滑动门技术02
    ASP.NET2.0中创建自定义配置节处理程序(声明性模型)
    怎样看到ASP.NET从ASPX产生的代码?
    PetShop 4.0 详解之六(PetShop表示层设计)
    如何让Office 2003通过正版验证
    在windows 2003中安装mysql5
    Agile PLM 界面操作变慢优化
    Agile PLM 数据库密码修改
    Agile PLM 文件服务器报错解决
    pyautogui
  • 原文地址:https://www.cnblogs.com/tianzhendengni/p/13844793.html
Copyright © 2020-2023  润新知