zoukankan      html  css  js  c++  java
  • 页面静态化3 --- 伪静态技术之Apache的rewrite机制

     

    Apache的rewrite机制:

    意思就是,你发送的地址,比如:http://localhost/news-id67.html会被Apache改写成http://localhost/news.php?id=67;

    Apache本身内置了一个模块:(httpd.conf)

    #LoadModule rewrite_module modules/mod_rewrite.so ---- 去掉注释,开启Apache内置的重写模块
    开启模块过后,这个模块把news-id67.html重写为news.php?id=67
    而后,Apache去解析的页面变为http://localhost/news.php?id=67.html
    其实http://localhost/news.php?id=67.html这个页面时不存在的,而是Apache将news-id67.html这个部分的内容重写了一下。

    附,原理图

    下面要讨论的就是这个rewrite机制:

    ①如何配置rewrite

    ②如何写rewrite重写规则

    使用rewrite步骤:

    Ⅰ   检测Apache是否已经支持了mod_rewrite

        ①利用函数phpinfo()函数,Ctrl+F查找 Loaded-Modules 查看开启的模块列表中是否包含 mod_rewrite 模块,包括的话,则不需要配置这个模块。

        ②若没有配置,那么打开 httpd.conf 文件,Ctrl+F 查找 rewrite,去掉这行的注释,重启Apache服务器。

        ③如果没有找到这一行,那么找到 LoadModule 区域,在最后一行加入这句:LoadModule rewrite_module modules/mod_rewrite.so(要求独占一行),重启服务器。

    Ⅱ  配置虚拟主机

       ①windows系统,找到C:WindowsSystem32driversetchosts 文件

       在hosts文件中,添加IP和域名的对应关系

       

    127.0.0.1  www.test.com

       如图:

       ---------------------------------------------------------------------------------------------------------------

       

       ---------------------------------------------------------------------------------------------------------------------

       ②在httpd.conf文件中,查找 Virtual hosts

       

      #Virtual hosts 启用虚拟主机
    
      #include conf/extra/httpd_vhosts.conf     把前面的注释去掉

    Ⅲ  找到 httpd_vhosts.conf 文件,配置相应选项

       

        <VirtualHost  *:10094>
            ###SiteName test
            DocumentRoot "G:/Visual-AMP/www/test"
            ErrorLog    "../../logs/Apache/G__Visual-AMP_www_medu-error.log"
            TransferLog "../../logs/Apache/G__Visual-AMP_www_medu-access.log"
            ServerName www.test.com #域名和上面hosts文件中对应的域名一样
    
          ##配置rewrite机制
    
          ## 访问G:/Visual-AMP/www/test 的权限设置和重写机制都在标签内写
            <Directory "G:/Visual-AMP/www/test">
    
            #Deny from all #拒绝所有访问
    
            Allow from all #允许所有请求
    
            #是否允许Apache在没有获取到内容时显示目录结构,默认是允许的,要禁止,则删除掉下面的 Indexes
    
            # 补充说明:虚拟主机的根目录和文件都在Apache服务器外,比如:
    
              #DocumentRoot "H:/VA-test/test"
    
              #Directory "G:/VA-test//test"  --- 注意不是服务器的所在目录目录下面
    
              //那么注释掉下面这句话就再访问,就会是 forbidden,打开就会列出列表
                #Options Indexes FollowSymLinks Includes ExecCGI #或者在项目发布之后,这一行注释掉。
    
            #是否启用rewrite机制
                AllowOverride all
    
            #允许所有请求访问资源
                Require all granted
    
           
            </Directory>
       </VirtualHost>

       那么Directory之间的配置的默认配置是:在httpd.conf 中 Ctrl+F 查询 <Diretory 会找到配置项

       

       因为我用的是集成环境,所以上面的DocumentRoot 和 Directory 中的路径应该是 和 httpd_vhosts.conf 中的地址对应,从而在httpd.conf中找到默认的值。

       我这个集成环境下只有httpd.conf文件所以直接从httpd.conf找。

    Ⅳ  配置重写规则

       在对应的目录下,添加.htaccess 文件, 这个文件用来指定Apache的rewrite机制的规则的。

       用记事本另存为文件名为 .htaccess 的文件,在其中写入rewrite规则

       

      

       我们在转发的页面,也就是news.php 可以 通过 $id = $_GET['id'];获取到$id的值了。

       而其中的RewriteRule可以设置多个规则,匹配顺序从上到下。

    Ⅴ  rewrite规则也可以直接在<Directory ''>段直接配置

       

        <VirtualHost  *:10094>
            ###SiteName test
            DocumentRoot "G:/Visual-AMP/www/test"
            ErrorLog    "../../logs/Apache/G__Visual-AMP_www_medu-error.log"
            TransferLog "../../logs/Apache/G__Visual-AMP_www_medu-access.log"
            ServerName www.test.com #域名和上面hosts文件中对应的域名一样
    
          ##配置rewrite机制
    
          ## 访问G:/Visual-AMP/www/test 的权限设置和重写机制都在标签内写
            <Directory "G:/Visual-AMP/www/test">
    
            #Deny from all #拒绝所有访问
    
            Allow from all #允许所有请求
    
            #是否允许Apache在没有获取到内容时显示目录结构,默认是允许的,要禁止,则删除掉下面的 Indexes
    
            # 补充说明:虚拟主机的根目录和文件都在Apache服务器外,比如:
    
              #DocumentRoot "H:/VA-test/test"
    
              #Directory "G:/VA-test//test"  --- 注意不是服务器的所在目录目录下面
    
              //那么注释掉下面这句话就再访问,就会是 forbidden,打开就会列出列表
                #Options Indexes FollowSymLinks Includes ExecCGI #或者在项目发布之后,这一行注释掉。
    
            #是否启用rewrite机制
                AllowOverride all
    
            #允许所有请求访问资源
                Require all granted
                    #有时rewrite规则也可以直接在这个配置段配置,如果是配置再这里,那么.htaccess文件就可以不要了
             RewriteEngine On
             #RewriteRule 请求的URL正则 转发的页面
             RewriteRule news-id(d+).html$ news.php?id=$1
           
        
    </Directory>    </VirtualHost>


    Ⅵ  

     <VirtualHost  *:10094>
            ###SiteName test
            DocumentRoot "G:/Visual-AMP/www/test"
            ErrorLog    "../../logs/Apache/G__Visual-AMP_www_medu-error.log"
            TransferLog "../../logs/Apache/G__Visual-AMP_www_medu-access.log"
            ServerName www.test.com #域名和上面hosts文件中对应的域名一样
    
          ##配置rewrite机制
    
          ## 访问G:/Visual-AMP/www/test 的权限设置和重写机制都在标签内写
            <Directory "G:/Visual-AMP/www/test">
    
            #Deny from all #拒绝所有访问
    
            Allow from all #允许所有请求
    
            #是否允许Apache在没有获取到内容时显示目录结构,默认是允许的,要禁止,则删除掉下面的 Indexes
    
            # 补充说明:虚拟主机的根目录和文件都在Apache服务器外,比如:
    
              #DocumentRoot "H:/VA-test/test"
    
              #Directory "G:/VA-test//test"  --- 注意不是服务器的所在目录目录下面
    
              //那么注释掉下面这句话就再访问,就会是 forbidden,打开就会列出列表
                #Options Indexes FollowSymLinks Includes ExecCGI #或者在项目发布之后,这一行注释掉。
    
            #是否启用rewrite机制
                AllowOverride all
    
            #允许所有请求访问资源
                Require all granted
            
           #有时rewrite规则也可以直接在这个配置段配置,如果是配置再这里,那么.htaccess文件就可以不要了
             RewriteEngine On
             #RewriteRule 请求的URL正则 转发的页面
             RewriteRule news-id(d+).html$ news.php?id=$1
           
            </Directory>
           #该 www/ 目录下有test2依然可以针对test2文件夹进行规则配置
               <Directory "G:/Visual-AMP/www/test2">
    
            Deny from all #拒绝所有访问
    
            #Allow from all #允许所有请求
    
            #是否允许Apache在没有获取到内容时显示目录结构,默认是允许的,要禁止,则删除掉下面的 Indexes
    
            # 补充说明:虚拟主机的根目录和文件都在Apache服务器外,比如:
    
              #DocumentRoot "H:/VA-test/test"
    
              #Directory "G:/VA-test//test"  --- 注意不是服务器的所在目录目录下面
    
              //那么注释掉下面这句话就再访问,就会是 forbidden,打开就会列出列表
                #Options Indexes FollowSymLinks Includes ExecCGI #或者在项目发布之后,这一行注释掉。
    
            #是否启用rewrite机制
                AllowOverride all
    
            #允许所有请求访问资源
                Require all granted
            
           #有时rewrite规则也可以直接在这个配置段配置,如果是配置再这里,那么.htaccess文件就可以不要了
             RewriteEngine On
             #RewriteRule 请求的URL正则 转发的页面
             RewriteRule news-id(d+).html$ news.php?id=$1
           
            </Directory>
        
       </VirtualHost>
    

       因为每一个目录还可以单独进行配置,所以在单一目录下,还可以建立.htaccess,那么对应的配置段中的rewrite配置就可以注释掉。(或者在虚拟主机中配置段已经配置了rewrite规则,那么对应目录下就可以不建立.htaccess文件)

      

       

    总结:

      优点:方便实现对优化引擎的优化,比生成静态页面更加方便,首页每天自动变化

      URL重写的缺点:效率不如真静态页面,每次都会有读数据库,这个可以通过缓存技术来处理。

    下一节介绍,案例使用。

      

    ---- 始终相信这句:
    ----“做每天该做的事,不计结果!”
    ---- 因爲對於編程還只是新手,對很多知識掌握的不牢靠,歡迎大家批評指正~~|=-=|~~
  • 相关阅读:
    mysql用 法like concat()
    redis系列之数据库与缓存数据一致性解决方案
    day33:进程锁&事件&进程队列&进程间共享数据
    day32:进程&进程join&守护进程deamon
    day31:socketserver&hashlib&hmac&TCP登录
    day30:TCP&UDP:socket
    day29:计算机网络概念
    小程序3:ATM小程序
    hdu 6867 Tree 2020 Multi-University Training Contest 9 dfs+思维
    Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
  • 原文地址:https://www.cnblogs.com/Zell-Dinch/p/3927896.html
Copyright © 2011-2022 走看看