首页 > 代码库 > 页面静态化3 --- 伪静态技术之Apache的rewrite机制

页面静态化3 --- 伪静态技术之Apache的rewrite机制

 

Apache的rewrite机制:

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

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

<style></style>

#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:\Windows\System32\drivers\etc\hosts 文件

   在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重写的缺点:效率不如真静态页面,每次都会有读数据库,这个可以通过缓存技术来处理。

下一节介绍,案例使用。