铁血霸主 2007-8-1 22:29
用自定义404、403解决apache使用中文、不分大小写的问题
<p>示例网站:<A href="http://tinpoo.com/" target=_blank><FONT color=#22229c>http://tinpoo.com</FONT></A><BR>[php]<?<BR>/**<BR>* Filename : redirect.php<BR>* Author : kinpoo<BR>* Email : kinpoo AT gmail DOT com<BR>* Version : 20070316 <BR>* example : tinpoo.com<BR>* 喜悦首发<BR>*/<BR><BR>/**<BR>用自定义404、403解决<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'apache');" target="_self"><u><strong>apache</strong></u></a>使用中文、不分大小写的问题<BR><BR>为什么不直接用rawurlencode?<BR>1、百度对rawurlencode的支持不好。<BR>2、使用中文更加直观。<BR><BR>本程序还很粗糙,我们还可改进它,使apache完全支持中文,完全支持不分大小写<BR>比如以后我们可以在apache上直接使用<A href="http://x.x/" target=_blank><FONT color=#22229c>http://x.x/</FONT></A>我的实例/我的主页.php?id=1<BR>而不是毫无意义的<A href="http://x.x/%CE%D2%B5%C4%CA%B5%C0%FD/%CE%D2%B5%C4%D6%F7%D2%B3.php?id=1" target=_blank><FONT color=#22229c>http://x.x/%CE%D2%B5%C4%CA%B5%C0 ... 6%F7%D2%B3.php?id=1</FONT></A><BR>*/<BR><BR>header("HTTP/1.1 200 OK"); // 不改变浏览器中的显示<BR>header("expires:0");<BR>header("cache-control:no-cache,must-revalidate");<BR>header("pragma:no-cache");<BR><BR>$uri = url_convert_get(); // ** 转换中文路径(本程序的关键)<BR><BR>$url = '';<BR>$cwd = preg_replace("/^(.*)\/([^\/]*)$/", "\\1", $uri) . '/';<BR>$cwd = rawurldecode($cwd);<BR>$fle = strtolower(preg_replace("/^(.*)\/([^\/]*)$/", "\\2", $uri));<BR><BR>if (strpos($uri, '/redirect.php') !== false)<BR>{<BR>$url = '/';<BR>}<BR>elseif (file_exists('.' . $cwd))<BR>{<BR>if (in_array($fle, array('index.php', 'index.htm', 'index.html')))<BR>{ // #404, 如果此目录存在默认页 则转到默认页<BR>$url = $cwd;<BR>}<BR>elseif (!$fle)<BR>{ // #403, 如果不存在默认页 则显示自定义目录索引<BR>$idx = getcwd() . '/index.php'; // 自定义索引文件<BR>chdir('.' . $cwd);<BR>if (strpos(getcwd(), '/tinpoo.com/') !== false)<BR>{ // 在制定目录内 使用此功能 阻止不安全的访问<BR>require_once($idx);<BR>die();<BR>}<BR>else<BR>{<BR>header("HTTP/1.1 403 Forbidden");<BR>die('HTTP/1.1 403 Forbidden');<BR>}<BR>}<BR>else<BR>{ // #404, 解决文件名不分大小写的问题(此处没有解决目录不分大小写的问题)<BR>chdir('.' . $cwd);<BR>$dir = opendir('./');<BR>if ($dir)<BR>{<BR>while ($dir_element = readdir($dir))<BR>{<BR>if (strtolower($dir_element) == $fle)<BR>{<BR>$url = $cwd . $dir_element;;<BR>break;<BR>}<BR>}<BR>unset($dir_element);<BR>closedir($dir);<BR>}<BR>}<BR>}<BR><BR>if ($url)<BR>{<BR>$url = _rawurlencode($url);<BR>header("Location<IMG src="http://www.phpx.com/happy/images/smilies/shy.gif" align=absMiddle border=0>url");<BR>die();<BR>}<BR>else<BR>{<BR>header("HTTP/1.1 404 Not Found");<BR>die('HTTP/1.1 404 Not Found');<BR>}<BR><BR>function url_convert_get()<BR>{<BR>$u = explode('/', rawurldecode($_SERVER['REQUEST_URI']));<BR>foreach($u as $k => $v)<BR>{<BR>if ($v != '' && mb_detect_encoding($v))<BR>{ // 解决中文与rawurlencode混合的路径使用问题<BR>$u[$k] = mb_convert_encoding($v, 'GBK', mb_detect_encoding($v));<BR>}<BR>}<BR>$u = implode('/', $u);<BR>return $u;<BR>}<BR><BR>function _rawurlencode($s)<BR>{<BR>$s = str_replace('%2F', '/', rawurlencode($s));<BR>return $s;<BR>}<BR>?>[/php]<BR></p> <center><input type="image" onclick=copyToClipBoard() src="http://www.phpchina.com/images/phpcn_book_bu_tj.gif" border="0"></center>