単一のユーザーデータベースと共通のコードを使用したmediawikiのサブドメインマルチインストール

このような恐ろしい見出しで私は何を言いたいのですか?



実際、すべてがシンプルです。



Wiki百科事典をたくさん作りたいドメインがあるとします。 個々のウィキに対して、個別のサブドメインが必要です。 しかし、我々は、これは単一のコード(リフォームの場合には、我々はすべての時間を変更することができます)上で動作するだけでなく、1件の登録、当社のwikiのすべての間でユーザーを持っていると思います。



この記事では、mediawikiエンジンの例を使用してこれを実装する方法について説明します。



なぜこれが必要なのですか?



私は自分の例で答えます。 さまざまなゲーム用のサイトがいくつかあります。 そして、私は常に、さまざまなゲーム用のある種の単一のWikiリソースを持ちたいと思っていました。



私のシナリオはこれです:

mediawikiをインストールします。



これまでのところ、すべてが簡単です。 プライマリドメインに通常どおりmediawikiをインストールします。 微妙なことはありません。



サーバー。



私のプロジェクトでは、nginxを使用しています。 設定はやや複雑ですが、Apacheよりもはるかに高速です。



私たちの場合、メインドメインのサブドメインに切り替える必要がありますが、とにかく同じコードが発生します。 簡単に実装されます:

server {

server_name playwiki.ru *.playwiki.ru;

root /wwwroot/playwiki.ru ;

index index.php;

}






ここで、nginxの動作にApacheとの違いがあることに注意してください。 実際、どのサブドメインに切り替えても、 server_nameが常に最初に参加します。



したがって、この場合、PEHAは常に«playwiki.ru»エンジンのMediaWikiをリダイレクト不正確になります$ _SERVER [「SERVER_NAME」]、で受信します。



すぐに、このバグを修正します:



最初のLocalSettings.phpに次のように記述します。

include ( 'My_ExtFunctions.php' );

$_SERVER[ 'SERVER_NAME' ] = ($pw_subdomain_prefix) ? $pw_subdomain_prefix . ".playwiki.ru" : "playwiki.ru" ;







終わりには、すぐに私たちのセットアップを接続します。

include ( 'My_LocalSettings.php' );





ここで、同時に、設定で2つのファイルを接続しました。 LocalSettings.phpをオーバーロードしたくありません。



$ pw_subdomain_prefixはMy_ExtFunctions.php設定されます

function getMySubDomainPrefix() {



$a = $_SERVER[ 'HTTP_HOST' ];

$a = substr($a, 0, strpos($a, ".playwiki" ));

if ($a == 'www' ) $a = '' ;



// secure it!

$a = str_replace( "\t" , "" , str_replace( "\r" , "" , str_replace( "\n" , "" , $a)));

$a = str_replace( "*" , "" , str_replace( "'" , "" , str_replace( "\"" , "" , $a)));

$a = str_replace( " " , "" , str_replace( "," , "" , str_replace( "." , "" , $a)));

$a = str_replace( "/" , "" , str_replace( "//" , "" , str_replace( "\0" , "" , $a)));



return $a;



}



$pw_subdomain_prefix = getMySubDomainPrefix();






サブドメイン上のMediaWikiを設定します。



そのため、サブドメインの名前は$ pw_subdomain_prefixにあります。 すべてのコードはMy_LocalSettings.phpで記述されます



デフォルトのスキンを設定します。

$wgDefaultSkin = 'monobook' ;





のは、スキンwow.playwiki.ruスキンフォルダ/スキン/ skin_wow /でなければなりませんためにサブドメイン(例えばを、対応するフォルダに求められたの作ってみましょう:

$wgStylePath = "{$wgScriptPath}/skins" . (($pw_subdomain_prefix == '' ) ? '' : "/skin_$pw_subdomain_prefix" );

$wgStyleDirectory = "{$IP}/skins" . (($pw_subdomain_prefix == '' ) ? '' : "/skin_$pw_subdomain_prefix" );






データベースをサブドメインに依存させましょう。 私の場合、 www.playwiki.ruのwikiは「playwiki」データベースを使用し(ユーザーなどを保存するためのメインベースになります)、サブドメインwikiはplaywiki_wow、playwiki_la2などのデータベースを使用します。

if ($pw_subdomain_prefix) $pw_subdomain_prefix = '_' . $pw_subdomain_prefix;

$wgDBname = 'playwiki' . $pw_subdomain_prefix;






共有テーブルの設定(ユーザー、IPブロッキング):

$wgSharedDB = 'playwiki' ; // The $wgDBname for the wiki database holding the main user table

$wgSharedPrefix = 'wk_' ; // The $wgDBprefix for the database, if not used, this can be omitted

$wgSharedTables = array( 'user' , 'user_properties' , 'ipblocks' , 'user_groups' );






サブドメインにログオンしたユーザーがサブドメインにログオンしたままになるように、Cookieに共通ドメインを設定します。

$wgCookieDomain = '.playwiki.ru' ;





各Wikiサブドメインに独自のロゴを作成します。

$wgLogo = "images/logo$pw_subdomain_prefix.png" ;





アップロード画像の設定(異なるフォルダー内):



$wgEnableUploads = true ;

$wgUploadDirectory = "images" ;

if ($pw_subdomain_prefix) $wgUploadDirectory .= "/img$pw_subdomain_prefix" ;

$wgUploadPath = "{$wgScriptPath}$wgUploadDirectory" ;



$wgUploadDirectory = "{$IP}/$wgUploadDirectory" ;






同時に、許可されていないユーザーの編集を禁止しています。

$wgGroupPermissions[ '*' ][ 'edit' ] = false ;

$wgGroupPermissions[ '*' ][ 'createpage' ] = false ;

$wgGroupPermissions[ '*' ][ 'createtalk' ] = false ;



$wgGroupPermissions[ 'user' ][ 'edit' ] = true ;

$wgGroupPermissions[ 'user' ][ 'createpage' ] = true ;

$wgGroupPermissions[ 'user' ][ 'createtalk' ] = true ;



$wgGroupPermissions[ 'sysop' ][ 'edit' ] = true ;

$wgGroupPermissions[ 'sysop' ][ 'createpage' ] = true ;

$wgGroupPermissions[ 'sysop' ][ 'createtalk' ] = true ;



$wgGroupPermissions[ 'bureaucrat' ][ 'edit' ] = true ;

$wgGroupPermissions[ 'bureaucrat' ][ 'createpage' ] = true ;

$wgGroupPermissions[ 'bureaucrat' ][ 'createtalk' ] = true ;






ウィキ百科事典の複製。



ここでは、非常にエレガントではありません。



wikiをインストールした後、ベースダンプをコピーしました。 今、新しいウィキを追加する必要があるとき、新しいデータベースを(ペンで)作成し、権限を登録して、そこにこのダンプを展開します。



原則として-寛容。 Wikiが1日に10個を持ち上げる予定がないことを考えると。 :)



All Articles