URIから「modules」という文字列を削る のバックアップ(No.1)


/modules/ について

 XOOPSというとこの文字列を思い出す人も多いのではないだろうか。別にXOOPS界隈から生まれた造語というわけではなく、XOOPSの「X」という文字すら入っていないのに、これを見るだけでXOOPSを連想するというのは不思議である。

 昔はこれが入っているとXOOPSを使っているのがわかるから消したいという人が多かったが、最近はサイト閲覧者にとって不必要な情報を持つURIのディレクトリは変更するか削るべきという流れになっている。どちらにしろ、気になるのであれば削除してもいいと思う。

まずmainfile.phpをハックする

 これはプリロードでは解決しないのでファイルに手を加えることになる。
 まず、mainfile.phpに以下のコードを挿入する。

$GLOBALS['_rewriteRulesFrom'] = array(
    '/example/',
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/example/',
    );
    
    $GLOBALS['_abs_offset'] = preg_replace('/https?:\/\/'.$_SERVER["HTTP_HOST"].'/','',XOOPS_URL);
    $GLOBALS['_rewriteRulesTo1'] = preg_replace('/^(.*)$/e','"!('.XOOPS_URL.'|\"".$GLOBALS["_abs_offset"]."|\'".$GLOBALS["_abs_offset"].")".preg_quote("\1","!")."!"', $GLOBALS['_rewriteRulesTo']);
    $GLOBALS['_rewriteRulesFrom1'] = preg_replace('/^(.*)$/','\\\1\1',$GLOBALS['_rewriteRulesFrom']);

    function modules_changer( $s ) {
        $s = preg_replace($GLOBALS['_rewriteRulesTo1'],$GLOBALS['_rewriteRulesFrom1'], $s);
        for($i=0; $i<count($GLOBALS['_rewriteRulesFrom']); $i++) {
            $s = preg_replace( '/('.preg_quote(XOOPS_URL,'/').'|"|\')'.preg_quote($GLOBALS['_rewriteRulesTo'][$i],'/').'/' , "\\1".$GLOBALS['_rewriteRulesFrom'][$i] , $s ) ;
        }
        return $s;
    }
    if (empty($_SERVER['REDIRECT_URL']) || ($_SERVER['REDIRECT_URL'] == $_SERVER['REQUEST_URI'])) {
        if (empty($_SERVER['REDIRECT_REDIRECT_STATUS'])) {
            if (($_changer_url=modules_changer('"'.$_SERVER['REQUEST_URI'].'"')) != '"'.$_SERVER['REQUEST_URI'].'"') {
                //if request url is old url redirect to new
                header('Location: ' . str_replace('"','',$_changer_url));
            }
        }
    }
    $_SERVER['REQUEST_URI'] = str_replace( $GLOBALS['_rewriteRulesFrom'],$GLOBALS['_rewriteRulesTo'], @$_SERVER['REQUEST_URI'] ) ;
    $_SERVER['HTTP_REFERER'] = str_replace($GLOBALS['_rewriteRulesFrom'], $GLOBALS['_rewriteRulesTo'], @$_SERVER['HTTP_REFERER'] ) ;
    
    ob_start( 'modules_changer' ) ;

 挿入場所だが、mainfile.phpの上の方に英語の文章がずらずらと書かれている、

<?php
// $Id: mainfile.dist.php,v 1.1 2007/05/15 02:34:29 minahito Exp $
//  ------------------------------------------------------------------------ //
//                XOOPS - PHP Content Management System                      //
//                    Copyright (c) 2000 XOOPS.org                           //
//                       <http://www.xoops.org/>                             //
//  ------------------------------------------------------------------------ //
//  This program is free software; you can redistribute it and/or modify     //
//  it under the terms of the GNU General Public License as published by     //
//  the Free Software Foundation; either version 2 of the License, or        //
//  (at your option) any later version.                                      //
//                                                                           //
//  You may not change or alter any portion of this comment or credits       //
//  of supporting developers from this source code or any supporting         //
//  source code which is considered copyrighted (c) material of the          //
//  original comment or credit authors.                                      //
//                                                                           //
//  This program is distributed in the hope that it will be useful,          //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of           //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            //
//  GNU General Public License for more details.                             //
//                                                                           //
//  You should have received a copy of the GNU General Public License        //
//  along with this program; if not, write to the Free Software              //
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
//  ------------------------------------------------------------------------ //

 この下辺りがいいだろう。
 次に挿入するコードの一番上、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/example/;',
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/example/;',
    );

 ここの/example//modules/example/のところに/modules/を消したいモジュールのディレクトリ名を入れる。たとえば、d3forumであれば、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/d3forum/',
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/d3forum/',
    );

 こんな感じになるだろうか。上ではわかりやすいようにディレクトリ名を合わしているが、必ずしも合わせる必要はなく、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/bbs/',
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/d3forum/',
    );

 などとしても構わない。複数設定するときは、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/bbs/',
    '/blog/',
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/d3forum/',
    '/modules/d3blog/',
    );

 こんな風に下に足していけばいい。元のディレクトリ名と短くするディレクトリ名は必ず対にする。
 これでXOOPSが出力するアドレスは以下のようになる。

 http://example.com/modules/d3forum/
 ↓
 http://example.com/bbs/

続いて.htaccessにmod_rewriteの設定を加える

 このままだとアクセスしても404エラーが出るだけなので、mainfile.phpがあるディレクトリの.htaccessにmod_rewriteの設定を書き込む。仮に/modules/d3forum/を/bbs/としたということであれば、

RewriteEngine On
RewriteRule ^bbs/(.*)$ /modules/d3forum/$1 [L]

 この二行を加えよう。以上でカスタマイズ完了である。


[PR]