Linux

Mod_Rewrite もどき

2006年3月27日

 現在使用中のプロバイダ、nifty のラクーカンでは、Mod_Rewrite が使用できない。メールで問い合わせてみたが、やはり駄目のようである。
 以前使っていたサーバでは、Mod_Rewrite を多用していただけにつらいところである。何か手はないかと探ってみたら、完全ではないものの、一つ解決方法を見つけた。『Redirect』『FilesMatch』なら使えるようなので、これを使用した。


まず、.htaccess に次のように記述
<FilesMatch "^(item|catid|archive|archivelist)\-([0-9\-]+)\.html$">
  Redirect /nucleus/ /nucleus/pseudo.php?
</FilesMatch>

さらに、以下のようなphp (ファイル名:pseudo.php)を用意した。
<?php
// This file will generate and return the main page of the site
$CONF = array();
$CONF['Self'] = 'index.php';

$_GET=array();
if ($i=strpos($_SERVER['REQUEST_URI'],'?/')) {
    $page=substr($_SERVER['REQUEST_URI'],$i+2);
    if (preg_match('/^archive\-([0-9]+)\-([0-9]+)\-([0-9]+)\.html$/',$page,$matches)) {
        $_GET['archive']=$matches[2].'-'.$matches[3];
        $_GET['blogid']=$matches[1];
    } else if (preg_match('/^item\-([0-9]+)\.html$/',$page,$matches)) {
        $_GET['itemid']=$matches[1];
    } else if (preg_match('/^catid\-([0-9]+)\.html$/',$page,$matches)) {
        $_GET['catid']=$matches[1];
    } else if (preg_match('/^archivelist\-([0-9]+)\.html$/',$page,$matches)) {
        $_GET['archivelist']=$matches[1];
    } else if (preg_match('/\?([^\?]+)$/',$page,$matches)) {
        foreach(explode('&',$matches[1]) as $value) if ($i=strpos($value,'=')) {
            $_GET[substr($value,0,$i)]=urldecode(substr($value,$i+1));
        }
    }
} else if (preg_match('/\?([^\?]+)$/',$page,$matches)) {
    foreach(explode('&',$matches[1]) as $value) if ($i=strpos($value,'=')) {
        $_GET[substr($value,0,$i)]=urldecode(substr($value,$i+1));
    }
}

include('./config.php');

selector();

?>

これで、mod_rewriteもどきのブログのできあがり。普通の mod_rerite と違う点は、たとえば 『/nucleus/item-143.html』 にアクセスすると、実際には『/nucleus/pseudo.php?/item-143.html』が表示されることである。サーバとブラウザの間で一度余分な通信が入るが、keep-alive で通信しているならば、速度の問題はほとんどなさそうである。

コメント

コメントはありません

コメント送信