# 404 模拟 URL Rewrite

LooPo, PHP @ 03 July 2006

乐铺的服务器不支持 apache url rewrite,所以之前的网址都很“丑陋”,比如:

http://www.loopo.cn/items.php/110
http://www.loopo.cn/forum.php/1/100

因为这个原因,被几个朋友BS了几次……

今天在 DB 的时候,忽然想到一个办法:乐铺的服务器是支持自定义 404 页面的,这样的话,就可以把所有的请求定位到这个 404 页来处理了,即所有的页面“都是 404”,然后再统一由 404.php 来处理重定向。

花了差不多十分钟,实现了一下,现在乐铺的页面url是类似这样的了:

http://www.loopo.cn/items/110
http://www.loopo.cn/forum/1/100

会好看一些,不知道会不会有什么副作用。

核心代码差不多类似于:

function _404() {
    $url = $_SERVER['REQUEST_URI'];
    if ($tmp = explode("/", $url)) {
        array_shift($tmp);
        $_SERVER['PATH_INFO'] = join("/", $tmp);
        parse_str($_SERVER['REDIRECT_QUERY_STRING'], $_REQUEST);
        parse_str($_SERVER['REDIRECT_QUERY_STRING'], $_GET);
    }
    $rewrite[] = array('|^/whatnew/?|i', 'whatnew.php');
    $rewrite[] = array('|^/whathot/?|i', 'whathot.php');
    $rewrite[] = array('|^/whatmiss/?|i', 'whatmiss.php');
    foreach ($rewrite as $v) {
        if (preg_match($v[0], $url)) {
            @header("HTTP/1.1 200 OK");
            include ROOT.$v[1];exit;
        }
    }
}

UPDATE: 在测试的时候,发现 404 头信息已经发出来了,这样的话,可能会有被搜索引擎忽略的危险,后来又把代码改进了一下。加了一个 200 的头信息进去,不知道还会不会有问题,持续跟踪中……

Tags: , , ,

4 Responses to “404 模拟 URL Rewrite”

  1. Dash Says:

    我跟踪了一下,实际访问的时候没有收到404的头信息,所以应该没问题
    HTTP/1.1 200 OK

  2. ahu Says:

    嗯,有点意思

  3. 神仙 Says:

    问题是,没法接收post数据

  4. avenger Says:

    是的,post数据是目前唯一存在的问题。

Leave a Reply