MediaWiki

出自ProgWiki
跳至導覽 跳至搜尋
MediaWiki
MediaWiki-smaller-logo.png

作者
研發者 维基媒體基金會
最初正式版 2002年1月25日
最新穩定版 1.36.1 / 2021年6月23日,5個月前2021-06-23
最新測試版 /
作業系統 跨平台
系统平台
可用語言 超過200種語言
類型 Wiki引擎
授權協議 GPLv2+
網站 http://www.mediawiki.org

MediaWiki,參照:『維基百科~MediaWiki

安裝

相關文件

編輯手冊

研發手冊

關於MediaWiki與Extension的開發者
  1. CreateAccount
  2. Gerrit/Tutorial

Wiki網站介面

  • 網站的 icon (網頁瀏覽器家到書籤時所顯示的小圖示)
    • 預設位置 /favicon.ico
    • 或是在 LocalSettings.php 用 $wgFavicon 自訂網站 icon 圖示的Url
  • 網站 Logo 圖示
    • 舊版位置 /skins/common/images/wiki.png
    • 新版位置 /resources/assets/wiki.png
    • 或是在 LocalSettings.php 用 $wgLogo 自訂網站 Logo 圖示的Url
  • 導航面板 MediaWiki:Sidebar
  • 系統介面 Special:AllMessages
  • Manual:Interface/JavaScript
其他

編輯工具強化

  • 以下來自中文維基百科,需重新啟動MediaWiki系統,才會有作用(像是修改LocalSettings.php)……
中文維基百科 本站
  1. MediaWiki:Edittools
  2. Template:Edittools
  3. MediaWiki:Common.js
  4. MediaWiki:Common.js/search.js
  5. MediaWiki:Common.js/edit.js
  6. MediaWiki:Edittools.js
  7. MediaWiki:Edittool-plus.js‎
  8. MediaWiki:Gadgets-definition
  9. MediaWiki:Gadget-HotCat.js
  10. MediaWiki:Gadget-specialchars.js
  11. MediaWiki:Gadget-Edittools-vector.js
  12. MediaWiki:Gadget-externalsearch.js
  1. MediaWiki:Edittools
  2. Template:Edittools
  3. MediaWiki:Common.js
  4. MediaWiki:Common.js/search.js
  5. MediaWiki:Common.js/edit.js
  6. MediaWiki:Edittools.js
  7. MediaWiki:Edittool-plus.js‎
  8. MediaWiki:Gadgets-definition(小工具)
  9. MediaWiki:Gadget-edit0.js(編輯第0段)
  10. MediaWiki:Gadget-HotCat.js(快速增加分類)
  11. MediaWiki:Gadget-specialchars.js(將Template:Edittools的內容移到編輯內容之上)
  12. MediaWiki:Gadget-Edittools-vector.js(擴充編輯工具按鈕)
  13. MediaWiki:Gadget-externalsearch.js(擴充搜尋用)
  14. MediaWiki:Gadget-SourceHelper.js(按鈕【CopyText】與【ViewSource】)
  15. MediaWiki:Gadget-CatNav.js(分類導覽)
  16. MediaWiki:Gadget-Edittools-CatNav.js(擴充編輯工具按鈕-分類導覽)
  • 相關:
  1. 參照:『維基百科~Wikipedia:維基百科工具/編輯工具』(可與MediaWiki:Common.js相對照)
  2. VisualEditor icons
  3. Xi-Plus/MediaWiki-Gadget: My Javascript helper on Wikimedia and other wikis

外掛

載入外掛(需要修改LocalSettings.php)

  //MediaWiki 1.24 以上版本使用
  wfLoadExtension( '外掛名稱' );
 
  //MediaWiki 1.23 之前版本使用
  require_once "$IP/extensions/外掛名稱/外掛名稱.php";

預設在編輯時使用WikiEditor

#需要修改LocalSettings.php
# Enables use of WikiEditor by default but still allow users to disable it in preferences
$wgDefaultUserOptions['usebetatoolbar'] = 1;
$wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;
 
# Displays the Preview and Changes tabs
$wgDefaultUserOptions['wikieditor-preview'] = 1;
 
# Displays the Publish and Cancel buttons on the top right side
$wgDefaultUserOptions['wikieditor-publish'] = 1;

各種外掛

MediaWiki 1.34.0內建外掛

載入外掛 簡介 備註
wfLoadExtension( 'CodeEditor' ); 支援 JavaScript 與 CSS 語法醒目標示編輯使用 Ace 編輯器

$wgDefaultUserOptions['usebetatoolbar'] = 1;

wfLoadExtension( 'CategoryTree' ); 可用動態更新的方式導覽 分類結構
wfLoadExtension( 'Cite' ); 添加用於引用的 <ref> 與 標籤
wfLoadExtension( 'CiteThisPage' ); 加入 引用 特殊頁面及工具箱連結
wfLoadExtension( 'ConfirmEdit' ); 提供 CAPTCHA 技術來阻止垃圾訊息和密碼猜解
wfLoadExtension( 'Gadgets' ); 讓使用者可以於 偏好設定 中自訂 CSS 與 JavaScript 的小工具
wfLoadExtension( 'ImageMap' ); 允許客戶端使用 <imagemap> 標籤製作可點選的影像地圖
wfLoadExtension( 'InputBox' ); 可引用預先定義好的 HTML 表格
wfLoadExtension( 'Interwiki' ); 加入用來檢視和編輯跨 Wiki 連結表的特殊頁面
  • Extension:Interwiki
  • 需自行修改資料表 mw_interwiki,或是
  • $wgGroupPermissions['sysop']['interwiki'] = true;
wfLoadExtension( 'LocalisationUpdate' ); 將在地化的資訊盡可能保持最新
wfLoadExtension( 'MultimediaViewer' ); 使用全螢幕介面以較大尺寸的方式顯示展開後的縮圖
wfLoadExtension( 'Nuke' ); 提供管理員可執行大量刪除的頁面
wfLoadExtension( 'PageImages' ); 收集有關頁面中圖片的資訊
wfLoadExtension( 'ParserFunctions' ); 加強分析器,提供邏輯函數功能
wfLoadExtension( 'PdfHandler' ); 使用圖片模式檢視 PDF 檔案的處理程式。
wfLoadExtension( 'Poem' ); 提供 <poem> 標籤給予詩詞格式使用 (文章內容不自動串接)
wfLoadExtension( 'Renameuser' ); 加入用來重新命名使用者的特殊頁面 (需要開啟 renameuser 權限)
wfLoadExtension( 'Scribunto' ); 用來內嵌腳本語言到 MediaWiki 頁面的框架
wfLoadExtension( 'SpamBlacklist' ); 以正規表示法為基礎的防濫用工具,可將頁面中的URL及已註冊使用者的Email地址列入黑名單。
相關設定
wfLoadExtension( 'SyntaxHighlight_GeSHi' ); 使用 Pygments - Python syntax highlighter 提供可強調語法顯示的 <syntaxhighlight> 標籤。
wfLoadExtension( 'TextExtracts' ); 提供純文字或受限的頁面內容 HTML 匯出
wfLoadExtension( 'TitleBlacklist' ); 允許管理員可使用標題黑名單與標題白名單來禁止建立頁面與使用者帳號。
wfLoadExtension( 'WikiEditor' ); 提供高級、可擴充的 Wiki 文字編輯介面

MediaWiki 其他外掛

載入外掛 簡介 備註
wfLoadExtension( 'AdvancedSearch' ); Special:Search提供高級搜尋功能的輕鬆存取
wfLoadExtension( 'SimpleFeed' ); Uses SimplePie to output RSS/atom feeds
wfLoadExtension( 'SyntaxHighlight_GeSHi' ); 使用 GeSHi Highlighter 提供可強調語法顯示的 <syntaxhighlight> 標籤。
wfLoadExtension( 'Tabs' ); 增加 <tabs> 與 <tab> 標籤用來建立使用頁籤的版面。
wfLoadExtension( 'LunarFunctions' ); 提供計算農曆功能
wfLoadExtension( 'Echo' );
wfLoadExtension( 'Flow' ); 結構式討論
wfLoadExtension( 'ParserFunctions' ); 
wfLoadExtension( 'Echo' ); 
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';
wfLoadExtension( 'Flow' );
  • edit file: /extensions/Flow/includes/Container.php
include_once __dir__ .'/Pimple/Container.php';
  • and download Pimple to /extensions/Flow/includes/Pimple/
其他
https://extdist.wmflabs.org/dist/extensions/
需用git下載
https://phabricator.wikimedia.org/source/extensions.git
https://github.com/wikimedia/mediawiki-extensions.git


其他相關

MediaWiki

Semantic MediaWiki

相關討論區

FAQ

啟用Debug模式

  • 在 LocalSettings.php
error_reporting( -1 );
ini_set( 'display_startup_errors', 1 );
ini_set( 'display_errors', 1 );
$wgShowSQLErrors = true;
$wgDebugDumpSql  = true;
$wgShowExceptionDetails = true;
$wgDevelopmentWarnings = true;

【安全性相關】禁止未登入者編輯

  • 用途:防止來路不明的廣告
  • 資料來源: Manual:User_rights
  • 在LocalSettings.php的最後面追加:
#禁止未登入者建立帳號
$wgGroupPermissions['*']['createaccount'] = false;
#禁止未登入者編輯
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['writeapi'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;

【安全性相關】防止異常URL耗盡主機的CPU資源

  • 警告, MediaWiki 各版本可能隱含CPU資源耗盡的漏洞?(目前已知MediaWiki 1.12.0有此漏洞)。
  • 治標方式,修改index.php
  1. 將未有title參數的URL,重定向到首頁。(title為null或空字串)
  2. action為URL中第一個傳入參數,此為非正常的MediaWiki的URL,重定向到首頁。
  3. 迴避Ajax的分類樹的URL參數(?action=ajax與?rs=)
# Query string fields
$action = $wgRequest->getVal( 'action', 'view' );
$title = $wgRequest->getVal( 'title' );
 
#請自行加上,下面這段, 可將非正常參數的URL導向首頁  Fix Bug?
#(如果你的首頁位置不是「index.php/%E9%A6%96%E9%A0%81」,請自行改寫下列header內的字串)
if (is_null($_GET["rs"]) and ((is_null( $title ) or ($title == "")) or
	((substr($_SERVER['QUERY_STRING'],0,7)=='action=') and ($_GET["action"]!="ajax"))))
{
	header("Location: index.php/%E9%A6%96%E9%A0%81"); exit;
	#header("Location: " & $wgScriptPath & "/index.php/%E9%A6%96%E9%A0%81" ); exit;
}

伺服器端縮圖失敗

  • 用途:禁止伺服器端縮圖
  • 由於PHP的安全性設定,導致與縮圖相關的程式碼跑到passthru()就跳失敗了
  • 在LocalSettings.php的最後面追加下列三行:
$wgUseImageMagick = false;
$wgUseImageResize = false;
$wgGenerateThumbnailOnParse = false;

MediaWiki機器人

計算內部連結的紅連與藍連的數量

javascript:(function(){var%20j=0;var%20array=document.getElementById('content').getElementsByTagName('A');var%20k=array.length;for(i=0;i%3Carray.length;i++){l=array[i].href;if(l.indexOf(document.location.href.split(/^http\:\/\/([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)%3F)\//)[1])%3C0||l.indexOf('%23')%3E0||l.indexOf('section')%3E0)k--;if(l.indexOf('redlink')%3E0){j++;k--;}}prompt(document.getElementById('firstHeading').textContent+'%E5%85%B1%E6%9C%89%EF%BC%9A','%E7%B4%85%EF%BC%9A'+j+'%20%E8%97%8D%EF%BC%9A'+k+'%20%E6%AF%94%E4%BE%8B%EF%BC%9A'+(j/k));})();

User自訂Skin的js與css

$wgAllowUserJs = true;
$wgAllowUserCss = true;

自定網路書源

  • Manual:ISBN
  • 以中文介面為例,需改 languages/messages/MessagesZh_hant.php 裡的 $bookstoreList
$bookstoreList = array(
	'博客來書店' => 'http://search.books.com.tw/exep/prod_search.php?cat=BKA&key=$1&apid=books&areaid=head_cat_search',
	'三民書店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
	'天下書店' => 'http://www.cwbook.com.tw/searchProduct/QueryProductAction.shtml?searchField=ISBN&searchKeyWord=$1&searchUpAge=&searchBottomAge=',
	'新絲路書店' => 'http://www.silkbook.com/search_result.asp?SearchText=$1&SearchOption=4'
);

如何只使用一份MediaWiki的Code去架多個Wiki

維基農場
  • 請注意,MediaWiki是很吃資源的一種Wiki,架設過多的Wiki,可能會導致被php虛擬主機商強迫關站,因此使用前請三思。
  1. MediaWiki下載與安裝(限定使用1.25~1.19的版本,例如安裝在 /wiki),最初安裝時資料庫前置使用「 mw_ 」以便配合Extension:Farmer。
  2. Extension:Farmer下載對應的版本,將該外掛放到 extensions 資料夾裡。
  3. 將外掛的farmer.sql,拿到資料庫裡跑過一遍,建立相關的資料表。再把 mw_user 建立檢視 user。
  4. 修改你的 LocalSettings.php,以下內容請配合你最初安裝MediaWiki的設定做修改:
# MySQL specific settings
$wgDBprefix = "mw_";

$callingurl = $_SERVER['REQUEST_URI'];
if ( preg_match(  '/[^\/]+/', $callingurl, $matches ) === 1 ) {
   if ( array_key_exists( 0, $matches ) ) {
       //$wgDBprefix = $matches[0] . "_";
       $wgScriptPath = "/" .$matches[0];
       $wgStylePath = "$wgScriptPath/skins";
       
        //$wgLogo = "/wikis/" . $matches[0] ."/wiki.png";
        $wgUploadDirectory = "/home/wf0822/public_html/wikis/" . $matches[0] ."/images"; 
        $wgUploadPath = "/wikis/" . $matches[0] ."/images";
   }
}

# 中間的其他設定
#

require_once( "$IP/extensions/Farmer/Farmer.php" );
 
/* We use the internal _matchByURLHostname function to find the wiki name */
#依子目錄區分的模式
$wgFarmerSettings['wikiIdentifierFunction'] = array( 'MediaWikiFarmer', '_matchByURLRegExp' );
$wgFarmerSettings['matchRegExp'] = '/[^\/]+/';
$wgFarmerSettings['matchOffset'] = 0;

$wgFarmerSettings['dbAdminUser'] = $wgDBadminuser;
$wgFarmerSettings['dbAdminPassword'] = $wgDBadminpassword;
$wgFarmerSettings['databaseName'] = $wgDBname;
$wgFarmerSettings['dbTablePrefixSeparator'] = '_';

# Use this file in early versions
$wgFarmerSettings['newDbSourceFile'] = realpath( dirname( __FILE__ ) ) . '/maintenance/tables.sql';
$wgFarmerSettings['defaultWiki'] = "mw"; # Change it to one you want required by default

$wgFarmer = new MediaWikiFarmer( $wgFarmerSettings );
 
$wgFarmer->run();
  • 依子目錄區分的模式需要在網站根目錄的.htaccess 設定 Url Rewrite
SetEnv TZ Asia/Taipei

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^[^\/]+/(.+)$ wiki/$1 [PT,L,QSA]
RewriteRule ^[^\/]+/$ wiki/index.php [PT,L,QSA]
RewriteRule ^[^\/]+$ wiki/index.php [PT,L,QSA]
  • 修改MediaWikiFarmer_Wiki.php(不然新建Wiki時,相關的資料表無法順利建立?)
    • 未完,待查 (目前預設首頁與預設User與群組資料, 沒有正常建立? 原因不明)
	public function create() {
		$farmer = MediaWikiFarmer::getInstance();

		// save the database prefix accordingly
		$this->wgDefaultSkin = $farmer->defaultSkin;

		// before we create the database, make sure this database doesn't really exist yet
		if ( !$this->exists() && !$this->databaseExists() ) {
#
global $wgDBprefix, $wgDBname; 
    $wgDBprefix_tmp = $wgDBprefix;
    $wgDBprefix= $this->_name . '_';
     $db2 = $this->getDatabase();
     $db2->tablePrefix($wgDBprefix);
     $db2->selectDB( $wgDBname );
#
			 $this->save();
 			$this->createDatabase();
			$farmer->updateFarmList();
#
    $wgDBprefix = $wgDBprefix_tmp;
    $db2->tablePrefix($wgDBprefix);
#
		} else {
			throw new MWException( wfMsgHtml( 'farmer-error-exists', $this->_name ) );
		}
	}


public function createDatabase() {
		$this->_createTablesForWiki();
                //預設首頁建立失敗?
		//$this->_createMainPageForWiki();  
		$this->_populateInterwiki();

                //群組建立了, 但是使用者沒建立?
		$this->_populateUserGroups();
	}

其他

常見故障原因

  1. 主機上的temp路徑唯獨或沒有寫入權限
    在LocalSettings.php 另設 $wgTmpDirectory 變數, 給它一個權限為755的路徑
  2. 主機上的PHP因為預設啟用魔術引號功能?
    在 .htaccess 加上 php_flag magic_quotes_gpc Off
  3. 圖檔上傳失敗
    images下的所有資料夾不是777權限,圖檔會先寫到/images/lockdir再複製到對應的資料夾

載入Script

1.修改 LocalSettings.php
$wgHooks['BeforePageDisplay'][] = function( OutputPage &$out, Skin &$skin ) {
	$out->addScriptFile( 'https://www.example.org/awesomescript.js' );
};
2.修改 MediaWiki:Gadgets-definition 並新增對應的Script
3.在Script裡使用
mw.loader.load( 'https://www.example.org/index.php?title=MediaWiki:Example.js&action=raw&ctype=text/javascript' );
//或是
mw.loader.getScript( 'https://www.example.org/index.php?title=MediaWiki:Example.js&action=raw&ctype=text/javascript' );
//或是
$.getScript( 'https://www.example.org/index.php?title=MediaWiki:Example.js&action=raw&ctype=text/javascript' );

Js常用變數

用途 變數
頁面動作 mw.config.get('wgAction')
  • "view"(檢視)
  • "edit"(編輯)
  • "submit"(預覽)
命名空間 mw.config.get('wgNamespaceNumber')
  • 0(條目)
  • 6(檔案)
  • 8(MediaWiki)
  • 10(模版)
  • 14(分類)
特殊頁面 mw.config.get('wgCanonicalSpecialPageName')
  • "Search"(搜尋)

Log檔不斷成長的問題

  • 需定期刪除MediaWiki所在資料夾裡的 error_log 檔案

importScript()已停用

// Local script
mw.loader.load( '/w/index.php?title=MediaWiki:Gadget-HotCat.js&action=raw&ctype=text/javascript' );
 
// Local script
mw.loader.getScript( 'https://example.org/x-1.0.0.js' )
    .then( function () {
        // Script succeeded. You can use X now.
    }, function ( e ) {
        // Script failed. X is not available
        mw.log.error( e.message ); // => "Failed to load script"
    } );
} );

啟用MagicLink

$wgEnableMagicLinks['ISBN'] = true;   //書籍類
$wgEnableMagicLinks['RFC'] = true;    //網路相關技術文件
$wgEnableMagicLinks['PMID'] = true;   //生命科學和醫學等領域的文獻

特殊頁面的跨語言

  • MediaWiki:Gadget-interLanguageLink.js
( function ( $, mw ) {
 
    var interLanguageLinkSet = {
        'Recentchanges' : [
            {
                lang: 'en',
                name: '英文',
                url: 'https://en.wikipedia.org/wiki/Special:RecentChanges'
            },
            {
                lang: 'ja',
                name: '日文',
                url: 'https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E6%9C%80%E8%BF%91%E3%81%AE%E6%9B%B4%E6%96%B0'
            }
        ] 
    };
 
    // 在特殊頁面加上跨語言連結
    //if (mw.config.get('wgCanonicalNamespace') == 'Special') {
    if (mw.config.get('wgNamespaceNumber') === -1) {
 
        specialPageName = mw.config.get('wgCanonicalSpecialPageName');
 
        skin = mw.config.get('skin');
 
        linkSet = interLanguageLinkSet[specialPageName];
        if (linkSet != null) {
            $('#p-lang>div>ul').html("");
 
            linkSet.forEach(function(item, index, array){
 
                content = '<li class="interlanguage-link interwiki-'+ item.lang + '"><a href="' + item.url +'" title="" hreflang="' + item.lang + '" class="interlanguage-link-target" lang="' + item.lang + '">' + item.name + '</a></li>';
 
                $('#p-lang>div>ul').append(content);
            });
 
        }
    }
 
 
}( jQuery, mediaWiki ) );

防止非正常URL進入

// Check to make sure we're actually in MediaWiki.
if (!defined('MEDIAWIKI'))
{
	echo 'This file is part of MediaWiki. It is not a valid entry point.';
	exit(1);
}

其他因為MediaWiki改版衍生的錯誤

  • MediaWiki Call to undefined method Parser::disableCache()
把 ->disableCache(); 改成 ->getOutput()->updateCacheExpiry(0);