htaccess文件的应用例子


本站编码是UTF8,但是上传到虚拟主机之后,浏览器不能自动识别,只能手动选择UTF8编码或者是自动检测,先看到的解决方法是将meta标签放在title前面.但是不管用,继续搜索,原来是虚拟主机的配置文件规定了默认编码是GBK,而这个编码优先于html的meta标签,所以解决办法是在网站根目录的htaccess中添加下面的代码

AddDefaultCharset UTF-8

于是顺便研究了一下htaccess,发现还有另一个用处,即Url 重写.

本站的每篇文章都拥有一个目录,这个目录下包含文章正文和配置文件,这个目录可以包含文章的一些自定义特性,例如样式,用到的各种资源,在必要的时候可以用完全不同的方式来呈现一篇文章.有点麻烦的是每个这样的目录下都有一个index.php , 这文件的作用只是包含一个公共入口.使用url重写可以完全去掉这个index.php , 当访问此目录的时候,重定向到一个文件,该文件完成之前index.php的作用.我们需要在htacces中添加:

# Original
# If you modify this file then change the above line to: # Modified
<IfModule mod_rewrite.c>
   RewriteEngine On
   # Certain hosts may require the following line.
   # If vanilla is in a subfolder then you need to specify it after the /. 
   # (ex. You put Vanilla in /forum so change the next line to: RewriteBase /forum)
   # RewriteBase /
   RewriteCond %{REQUEST_FILENAME} -d
   RewriteCond %{REQUEST_FILENAME}/index.php !-f
   
   RewriteRule ^(.*)$ ops.php\?p=$1 [QSA,L]
</IfModule>

对于一个目录,而且目录下的index.php不存在,就进行url重写.我们的脚本中会判断该目录是否是一篇文章,如果是的话就执行特定的任务.

<?php
require_once("public/config.php");
// ops 页面

function isRequestForArticle() {
    //判断是否是请求一篇文章
    $str $_SERVER['REQUEST_URI'];
    // regex /article/.*/
    $matches = array();
    preg_match("~/article/([^/]*)/~i",$str,$matches);
        
    if (count($matches) > 1)
        return $matches[1];
    else
        return null;
}
$postdir = isRequestForArticle();
if $postdir == null)
{
    echo "not an article dir";
    exit;


$postdir =  DOC_ROOT."article/".$postdir.DS;
include("public/select_interpreter.php");



?>