页:
[1]
|
用自定义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] |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.008675 second(s), 2 queries |