URIから「modules」という文字列を削る

Last-modified: Wed, 03 Sep 2014 23:25:04 JST (1664d)

/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/のところにそれぞれ短くした任意のディレクトリ名と実際のディレクトリ名を入れる。たとえば、d3forumであれば、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/d3forum/', ←短くした任意のディレクトリ名
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/d3forum/', ←実際のディレクトリ名
    );

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

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

 などとしても構わない。ちなみに

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

 として、もう一つディレクトリを削ることも可能である。
 複数設定するときは、

$GLOBALS['_rewriteRulesFrom'] = array(
    '/bbs/',
    '/blog/',
    '/about/company.html', ←静的ファイル(たとえばpicoのwrapモードで表示しているような)はファイル名まで
    );
$GLOBALS['_rewriteRulesTo'] = array(
    '/modules/d3forum/',
    '/modules/d3blog/',
    '/modules/pico/company.html',
    );

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

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

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

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

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

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

参考サイト

 のぶのぶXOOPS - XOOPS YYBBS

副作用の可能性

 このハックは、なにかをしにサイトを訪ねてきたユーザを、「その用事だったら○○課へ」、で、ユーザが○○課へ行ったら「いや、担当部署が△△課になりました」とたらい回しにするようなハックなので、具体的にこれと言い切れないが思わぬ問題が起きる可能性もある。たとえばうちの本家では、携帯対応レンダラーとの絡みでドコモの携帯電話でアクセスし、なおかつ、アクセス先のページのファイルサイズがあるレベルを超える場合にのみエラーが出た。参考サイトののぶのぶさんの掲示板には、

ただxoopspollで投票すると、「投票を受け付けました。」と表示されるのですが、

票数が反映されなくなってしまいました。

 という書き込みがある。
 もし、運営しているサーバでサブドメインなどを自由に作れるなら、公開しないテストサイト(運用しているサイトのコピー)を作っていろいろと試してみた方がいいだろう。ぶっつけ本番で試して問題が起き、アドレスを戻すというとこになると自分にとってもユーザにとっても手間がかかってしまう。


[PR]