単一のユーザーデータベースと共通のコードを使用した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個を持ち上げる予定がないことを考えると。 :)

Source: https://habr.com/ru/post/J114607/


All Articles