喜悦国际村 » 喜悦原创 » 用自定义404、403解决apache使用中文、不分大小写的问题

页: [1]
kinpoo2007-3-16 07:59 AM
用自定义404、403解决apache使用中文、不分大小写的问题

示例网站:[url=http://tinpoo.com]http://tinpoo.com[/url]
[php]<?
/**
* Filename : redirect.php
* Author   : kinpoo
* Email    : kinpoo AT gmail DOT com
* Version  : 20070316
* example  : tinpoo.com
* 喜悦首发
*/

/**
用自定义404、403解决apache使用中文、不分大小写的问题

为什么不直接用rawurlencode?
1、百度对rawurlencode的支持不好。
2、使用中文更加直观。

本程序还很粗糙,我们还可改进它,使apache完全支持中文,完全支持不分大小写
比如以后我们可以在apache上直接使用[url]http://x.x/[/url]我的实例/我的主页.php?id=1
而不是毫无意义的[url]http://x.x/%CE%D2%B5%C4%CA%B5%C0%FD/%CE%D2%B5%C4%D6%F7%D2%B3.php?id=1[/url]
*/

header("HTTP/1.1 200 OK"); // 不改变浏览器中的显示
header("expires:0");
header("cache-control:no-cache,must-revalidate");
header("pragma:no-cache");

$uri = url_convert_get(); // ** 转换中文路径(本程序的关键)

$url = '';
$cwd = preg_replace("/^(.*)\/([^\/]*)$/", "\\1", $uri) . '/';
$cwd = rawurldecode($cwd);
$fle = strtolower(preg_replace("/^(.*)\/([^\/]*)$/", "\\2", $uri));

if (strpos($uri, '/redirect.php') !== false)
{
        $url = '/';
}
elseif (file_exists('.' . $cwd))
{
        if (in_array($fle, array('index.php', 'index.htm', 'index.html')))
        { // #404, 如果此目录存在默认页 则转到默认页
                $url = $cwd;
        }
        elseif (!$fle)
        { // #403, 如果不存在默认页 则显示自定义目录索引
                $idx = getcwd() . '/index.php'; // 自定义索引文件
                chdir('.' . $cwd);
                if (strpos(getcwd(), '/tinpoo.com/') !== false)
                { // 在制定目录内 使用此功能 阻止不安全的访问
                        require_once($idx);
                        die();
                }
                else
                {
                        header("HTTP/1.1 403 Forbidden");
                        die('HTTP/1.1 403 Forbidden');
                }
        }
        else
        { // #404, 解决文件名不分大小写的问题(此处没有解决目录不分大小写的问题)
                chdir('.' . $cwd);
                $dir = opendir('./');
                if ($dir)
                {
                        while ($dir_element = readdir($dir))
                        {
                                if (strtolower($dir_element) == $fle)
                                {
                                        $url = $cwd . $dir_element;;
                                        break;
                                }
                        }
                        unset($dir_element);
                        closedir($dir);
                }
        }
}

if ($url)
{
        $url = _rawurlencode($url);
        header("Location:$url");
        die();
}
else
{
        header("HTTP/1.1 404 Not Found");
        die('HTTP/1.1 404 Not Found');
}

function url_convert_get()
{
        $u = explode('/', rawurldecode($_SERVER['REQUEST_URI']));
        foreach($u as $k => $v)
        {
                if ($v != '' && mb_detect_encoding($v))
                { // 解决中文与rawurlencode混合的路径使用问题
                        $u[$k] = mb_convert_encoding($v, 'GBK', mb_detect_encoding($v));
                }
        }
        $u = implode('/', $u);
        return $u;
}

function _rawurlencode($s)
{
        $s = str_replace('%2F', '/', rawurlencode($s));
        return $s;
}
?>[/php]


查看完整版本: 用自定义404、403解决apache使用中文、不分大小写的问题


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.008675 second(s), 2 queries