“FAQ:MediaWiki”的版本间差异

来自Wikioe
跳到导航 跳到搜索
 
(未显示同一用户的22个中间版本)
第1行: 第1行:
[[category:MediaWiki]]
[[category:MediaWiki]]


<span style="font-weight:bold; font-size:150%;"> [https://www.mediawiki.org/wiki/Manual:FAQ/zh 官网FAQ] </span>
== 关于 ==
<div align="center"><span style="font-weight:bold; font-size:150%;"> [https://www.mediawiki.org/wiki/Manual:FAQ/zh 手册:常见问题] </span></div>


== 无法生成avg缩略图 ==
== '''open_basedir 问题''' ==
'''如果要使用第三方的converter,参见[https://www.mediawiki.org/wiki/Manual:Installing_third-party_tools#Image_thumbnailing Image thumbnailing页面]'''
<span style="color: red; font-size: 110%">Warning: is_executable(): '''open_basedir''' restriction in effect. '''File(/bin/bash)''' is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311</span>
* '''描述:'''
上传'''<code>.svg</code>'''文件过后,页面中提示“生成缩略图出错:无法创建临时缩略图文件”,在“特殊页面:文件列表”中查看文件时:
    [[File:MediaWiki:open_basedir问题.png|800px]]
'''<code>Warning: symlink() has been disabled for security reasons in /www/wwwroot/wiki.eijux.com/includes/media/SvgHandler.php on line 280</code>'''。
*'''处理:'''
默认安装的PHP一些函数是没有默认开启的。
我们需要的函数是'''<code>symlink()</code>''',则用在PHP的禁用函数中删除该函数即可。
----
* '''描述:'''
生成缩略图处提示:'''<code>sh: convert: command not found</code>''',PHP错误信息为'''<code>Warning: is_executable(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311</code>'''。
* '''处理:'''
先考虑是PHP配置的问题,
<pre>
PHP错误'''require(): open_basedir restriction in effect”''',即访问脚本不在'''<code>open_basedir</code>'''的限定目录里面,'''<code>open_basedir</code>'''的作用是将php所能打开的文件限制在指定的目录或文件。<br/>
</pre>
修改PHP配置文件<code>PHP.ini</code>的<code>open_basedir</code>之后错误依旧,而后一直都盯着<code>open_basedir</code>打转。兜兜转转许久才注意到<code>sh: convert: command not found</code>的提示,想到可能没有配置Svg Converter,从而进一步发现MediaWiki没有默认安装Converter。最后在[https://www.mediawiki.org/wiki/Manual:Image_administration/zh#SVG | 官网手册SVG节]了解到支持信息,相关的Converter("ImageMagick", "ImagickExt", "sodipodi", "inkscape", "batik", "rsvg", and "imgserv")均需单独安装。相较之下,选用了[https://www.mediawiki.org/wiki/Extension:NativeSvgHandler/zh | NativeSvgHandler]扩展(将SVG文件直接发送至客户端以进行客户端渲染)。步骤如下:<br/>
# '''下载文件,并将其放置在extensions/文件夹中的NativeSvgHandler目录内。(注意修改所有者及读写权限)'''
# '''将下列代码放置在您的LocalSettings.php的底部:'''<code>wfLoadExtension( 'NativeSvgHandler' );</code>''''''
# '''导航至Special:Version,以验证扩展已成功安装。'''
再于网页刷新,svg缩略图显示正常。


* 如果要使用第三方的converter,参见[https://www.mediawiki.org/wiki/Manual:Installing_third-party_tools#Image_thumbnailing<nowiki> Image thumbnailing页面]</nowiki>


== 左侧导航栏设置 ==
<blockquote>
MediaWiki的左侧导航栏,在搜索栏中搜索“<code>[http://wiki.eijux.com/index.php?title=MediaWiki:Sidebar mediawiki:Sidebar]</code>”,<br/>
<span style="color: blue; font-size: 120%">'''open_basedir(防止跨站攻击)'''</span> :用于'''将 PHP 所能打开的文件限制在指定的目录树''',以此防止跨目录、跨站的访问。
修改左侧导航栏如下:
<pre>
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help-mediawiki
* 标题
** 链接 |名称
** 链接 |名称
** 链接 |名称
</pre>
* Note:
*# “*”后为标题,可以是MediaWiki命名空间的页面(如navigation,即“[[MediaWiki:Navigation]]”)、文本内容,不能为http链接或MediaWiki格式链接。(其后没有“**”内容则该标题不显示)
*# “**”后为导航链接,可以是MediaWiki命名空间的页面(如mainpage,即“[[MediaWiki:Mainpage]]”)、http链接,不能为MediaWiki格式链接。
*# 默认侧边栏只有两级(标题、链接|名称),若要实现多级链接、树形链接,需要需要修改MediaWiki的相关代码,或用Extension实现。


=== 关于导航栏的SEARCH、TOOLBOX、LANGUAGES ===
1、本指令不受安全模式打开或者关闭的影响。
我想要在左侧导航栏通过类似于模板的方式,来自定义导航页并添加到[http://wiki.eijux.com/index.php?title=MediaWiki:Sidebar mediawiki:Sidebar]中,类似于其中的'''TOOLBOX'''('''SEARCH'''、'''LANGUAGES''')导航栏,<code>* TOOLBOX</code>,就可以变成:
<pre>
工具
链入页面
相关更改
上传文件
特殊页面
页面信息
</pre>
起初,我以为是需要在MediaWiki命名空间下安装Sidebar的规则编写文件就可以,但尝试一番以失败告终。<br/>
然后,我考虑是不是这些内容和skin有关,并在<code>skins\Vector\includes\VectorTemplate.php</code>中看到了线索:
<syntaxhighlight lang="php" line start="1" highlight="19,26">
private function buildSidebar() : array {
$skin = $this->getSkin();
$portals = $skin->buildSidebar();
$props = [];
$languages = null;


// Render portals
2、当一个脚本试图打开一个文件时,该文件的位置将被检查。
foreach ( $portals as $name => $content ) {
if ( $content === false ) {
continue;
}


// Numeric strings gets an integer when set as key, cast back - T73639
3、当文件在指定的目录树之外时 PHP 将拒绝打开它。
$name = (string)$name;
</blockquote>
:::* '''open_basedir''' 指定的限制是'''路径前缀,而非目录名'''。(如:设置“/dir/user”,则“/dir/user”和“/dir/user1”都是可以访问的)。
:::** 所以如果要将访问限制在仅为指定的目录,应用斜线结束路径名(如:“/dir/user/”)。
:::* '''open_basedir''' 若配置为 Linux 根目录“<span style="color: blue">'''/'''</span>”,则一定不会再报错,但是“'''防止跨站攻击'''”也就没啥意义了。


switch ( $name ) {
case 'SEARCH':
break;
case 'TOOLBOX':
$portal = $this->getMenuData(
'tb', $content, self::MENU_TYPE_PORTAL
);
// Run deprecated hook.
// Use SidebarBeforeOutput instead.
ob_start();
Hooks::run( 'VectorAfterToolbox', [], '1.35' );
$props[] = $portal + [
'html-hook-vector-after-toolbox' => ob_get_clean(),
];
break;
case 'LANGUAGES':
$portal = $this->getMenuData(
'lang',
$content,
self::MENU_TYPE_PORTAL
);
// The language portal will be added provided either
// languages exist or there is a value in html-after-portal
// for example to show the add language wikidata link (T252800)
if ( count( $content ) || $portal['html-after-portal'] ) {
$languages = $portal;
}
break;
default:
// Historically some portals have been defined using HTML rather than arrays.
// Let's move away from that to a uniform definition.
if ( !is_array( $content ) ) {
$html = $content;
$content = [];
wfDeprecated(
"`content` field in portal $name must be array."
. "Previously it could be a string but this is no longer supported.",
'1.35.0'
);
} else {
$html = false;
}
$portal = $this->getMenuData(
$name, $content, self::MENU_TYPE_PORTAL
);
if ( $html ) {
$portal['html-items'] .= $html;
}
$props[] = $portal;
break;
}
}
       
$firstPortal = $props[0] ?? null;
if ( $firstPortal ) {
$firstPortal[ 'class' ] .= ' portal-first';
}


return [
'''解决方案:'''
'has-logo' => $this->isLegacy,
# <span style="color: blue">'''关闭“防止跨站攻击”'''</span>:
'html-logo-attributes' => Xml::expandAttributes(
## 通过“<span style="color: green">'''宝塔面板'''</span>”关闭:网站 -> 站点设置 -> 网站目录:取消“防止跨站攻击(open_basedir)”。如下图:
Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) + [
##: [[File:宝塔面板:防止跨站攻击(open_basedir).png|600px]]
'class' => 'mw-wiki-logo',
## 通过“<span style="color: green">'''配置文件'''</span>”关闭:注销如下语句即禁用。
'href' => Skin::makeMainPageUrl(),
##: <syntaxhighlight lang="PHP" line highlight="4">
]
...
),
 
'array-portals-rest' => array_slice( $props, 1 ),
phpIniOverride  {
'data-portals-first' => $firstPortal,
#php_admin_value open_basedir "/tmp/:/www/wwwroot/wiki.eijux.com/"
'data-portals-languages' => $languages,
}
];
 
}
...
</syntaxhighlight>
##* 配置文件:位于“<span style="color: green">/www/server/panel/vhost/openlitespeed/detail/wiki.eijux.com.conf</span>”。
# <span style="color: blue">'''配置“open_basedir”'''</span>:修改“<span style="color: blue">'''.user.ini'''</span>”文件,添加必要的目录树。步骤:
## 根据错误信息,查找需要添加的目录;
##: 如上:“File(/bin/bash) 不在被允许的路径中”
##* 也可以根据“服务器上的站点错误日志<ref>位于:“/www/wwwlogs/wiki.eijux.com.error.log”。</ref>”。
## '''确认“待添加目录”的“实际路径”''':因为目录可能是 '''Symlink'''(符号链接);
##: 如上:“/bin/bash”就是指向“/usr/bin/bash”的符号链接。
## 开启站点的“防止跨站攻击”,并配置“<big>'''.user.ini'''</big>”文件:
##: <span style="color: blue">'''<syntaxhighlight lang="PHP" line highlight="">
open_basedir=/www/wwwroot/wiki.eijux.com/:/tmp/:/usr/bin/bash
</syntaxhighlight>'''</span>
## 访问站点的文章页面,以确定不再有“open_basedir 问题”。
:::<span style="color: blue; font-size: 120%">【2022/08/23 17:47:44 验证】</span>
 
 
“<span style="color: blue; font-size: 150%">'''.user.ini'''</span>”:用于配置“'''open_basedir'''”
1、开启“防止跨站攻击”后自动生成。(<span style="color: blue">'''位于项目根目录'''</span>)
2、关闭“防止跨站攻击”自动删除;
3、不能被上传覆盖,只能在服务器修改;
<big>可以通过<span style="color: green">'''宝塔面板'''</span>来修改</big>
[[File:宝塔面板:修改“.user.ini”.png|800px]]
 
== 页面显示无格式 ==
访问所有页面都只有文字,没有格式。如图:
    [[File:MediaWiki:“$wgScriptPath”设置导致页面显示格式不对.png|800px]]
 
'''解决:'''
# 检查本地网络环境;
# 检查系统配置文件(“'''LocalSettings.php'''”)中的“<span style="color: blue; font-size: 120%">'''$wgScriptPath'''</span><ref>[[手册:LocalSettings#$wgScriptPath]]</ref>”配置。
#* “'''$wgScriptPath'''”的配置与 MediaWiki 安装路径不匹配,会导致无法获取 MediaWiki 的各个脚本,从而出现上述情况。
 
== '''SVG'''<ref>参考:[https://www.mediawiki.org/wiki/Manual:Image_administration/zh#SVG Manual:Image administration#SVG]</ref> 缩略图问题 ==
初次上传 svg(矢量图)时,遇到了几个问题,基本上都是由于配置不完全导致。
 
=== “无法创建临时缩略图文件” ===
上传“<span style="color: blue; font-size: 150%">'''.svg'''</span>”文件后:
1、页面提示:“<span style="color: red">'''生成缩略图出错:无法创建临时缩略图文件'''</span>”。
2、在“'''[[特殊:文件列表]]'''”中查看文件时,提示:“<span style="color: red">'''Warning: symlink() has been disabled for security reasons in /www/wwwroot/wiki.eijux.com/includes/media/SvgHandler.php on line 280'''</span>”。
 
'''解决:''' 在服务器的 PHP 配置中,将禁用的函数“<span style="color: blue; font-size: 120%">'''symlink()'''</span><ref>默认情况下,是被禁用的函数。可以使用“<span style="color: blue">宝塔面板</span>快速设置。”</ref>”删除。
 
 
=== “sh: convert: command not found” ===
生成缩略图处提示:<span style="color: red">'''sh: convert: command not found'''</span>。
 
<blockquote>
Mediawiki 支持 SVG 图像呈现:如果启用,SVG 图像可以像其他图像文件一样使用 —— 它们将自动呈现为 <span style="color: blue">'''PNG'''</span> 文件,并根据需要动态缩略图。
 
MediaWiki 默认没有安装任何“<span style="color: blue; font-size: 120%">'''转换器'''</span>”(Converter<ref>Converter("ImageMagick", "ImagickExt", "sodipodi", "inkscape", "batik", "rsvg", and "imgserv")均需单独安装。</ref>),以下选择安装“<span style="color: blue; font-size: 120%">'''NativeSvgHandler'''</span><ref>插件“'''NativeSvgHandler'''”:将 SVG 文件直接发送至客户端以进行客户端渲染。<br/>参考:[https://www.mediawiki.org/wiki/Extension:NativeSvgHandler/zh Extension:NativeSvgHandler]</ref>”。
</blockquote>
 
'''解决:'''
# 下载“'''NativeSvgHandler'''”到服务器(“./extensions/”)中;
#* 注意修改所有者及读写权限。
# 配置启动('''LocalSettings.php''' 中):
#: <syntaxhighlight lang="PHP" highlight="">
wfLoadExtension( 'NativeSvgHandler' );
</syntaxhighlight>
</syntaxhighlight>
不懂PHP粗略看了下,自定义导航名称的话当前函数内并没有<code>Hooks::run( 'VectorAfterToolbox', [], '1.35' );</code>类似的代码会执行,不知道函数返回之后的流程,就此搁置,以后再看吧。<br/>
【2020/09/09 00:40:57】


== “open_basedir restriction in effect” ==
再于网页刷新,svg 缩略图显示正常。
* '''错误:''' '''<code>Warning: is_executable(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311</code>'''。<br/>
分析:出现此类问题一般为open_basedir的问题,即访问的文件不在'''<code>open_basedir</code>'''的限定目录里面'''(<code>open_basedir</code>的作用是将php所能打开的文件限制在指定的目录或文件,防止跨目录、跨站的访问)'''。
* '''处理:'''
<div style="background-color:#ffffcc; font-weight:bold;">
<s>
=== 修改php配置 ===
查阅PHP配置文件'''<code>php.ini</code>'''搜索'''<code>open_basedir</code>''',添加配置如下:
<pre>
; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
; http://php.net/open-basedir
; open_basedir =
open_basedir = /www/wwwroot/wiki.eijux.com/:/tmp/
</pre>
</s>
</div>
结果还是搞不定!<br/>


=== BTPanel防跨站攻击 ===
上网搜索一番才发现,'''BTPanel中站点设置的“网站目录”中有“防跨站攻击(open_basedir)”的选项,取消勾选之后,重启PHP''',就不再有这错误了。<br/>
(该选项的配置文件为:“'''/www/server/panel/vhost/openlitespeed/detail/wiki.eijux.com.conf'''”),取消勾选即注释了代码:
<pre>
phpIniOverride  {
#php_admin_value open_basedir "/tmp/:/www/wwwroot/wiki.eijux.com/"
}
</pre>


* '''注意:'''
=== “Warning: is_executable(): open_basedir ……” ===
注意用'''<code>open_basedir </code>'''指定的限制'''是路径前缀,而非目录名'''。所以如果要将访问限制在仅为指定的目录,应用斜线结束路径名。<br/>
PHP 错误信息为:<span style="color: red">'''Warning: is_executable(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311'''</span>
如:若'''"open_basedir = /dir/user"''', 那么目录 '''"/dir/user"''' 和 '''"/dir/user1"'''都是可以访问的。
 
<div style="background-color:#ffffcc; color:#e76700; font-weight:bold;">
'''解决:''' 参考:“'''[[#open_basedir 问题]]'''”。
设置'''<code>open_basedir</code>'''对此有效。之前解析'''<code>.svg</code>'''、使用'''<code>syntaxhighlight</code>'''遇到此问题时,还有确实依赖的库、服务的问题需要解决,此备忘。
</div>


== 目录控制 ==
== 参考 ==
当文章中含有3个以上标题时,mediawiki将自动在第一个标题之前生成目录(这是默认的设置)。<br/>
<references/>
* 如果需要隐去目录,可以在文章中加入“<code><nowiki>__NOTOC__</nowiki></code>”标记;
* 如果需要强制显示目录而不管标题数量,可以加入“<code><nowiki>__TOC__</nowiki></code>”标记;
* 这两个wiki标记不限制出现位置,但一般出现在文章第一个标题之前。

2022年8月23日 (二) 22:26的最新版本


关于

手册:常见问题

open_basedir 问题

Warning: is_executable(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311

    MediaWiki:open basedir问题.png


open_basedir(防止跨站攻击) :用于将 PHP 所能打开的文件限制在指定的目录树,以此防止跨目录、跨站的访问。

1、本指令不受安全模式打开或者关闭的影响。

2、当一个脚本试图打开一个文件时,该文件的位置将被检查。

3、当文件在指定的目录树之外时 PHP 将拒绝打开它。

  • open_basedir 指定的限制是路径前缀,而非目录名。(如:设置“/dir/user”,则“/dir/user”和“/dir/user1”都是可以访问的)。
    • 所以如果要将访问限制在仅为指定的目录,应用斜线结束路径名(如:“/dir/user/”)。
  • open_basedir 若配置为 Linux 根目录“/”,则一定不会再报错,但是“防止跨站攻击”也就没啥意义了。


解决方案:

  1. 关闭“防止跨站攻击”
    1. 通过“宝塔面板”关闭:网站 -> 站点设置 -> 网站目录:取消“防止跨站攻击(open_basedir)”。如下图:
      宝塔面板:防止跨站攻击(open basedir).png
    2. 通过“配置文件”关闭:注销如下语句即禁用。
      ...
      
      phpIniOverride  {
      #php_admin_value open_basedir "/tmp/:/www/wwwroot/wiki.eijux.com/"
      }
      
      ...
      
      • 配置文件:位于“/www/server/panel/vhost/openlitespeed/detail/wiki.eijux.com.conf”。
  2. 配置“open_basedir”:修改“.user.ini”文件,添加必要的目录树。步骤:
    1. 根据错误信息,查找需要添加的目录;
      如上:“File(/bin/bash) 不在被允许的路径中”
      • 也可以根据“服务器上的站点错误日志[1]”。
    2. 确认“待添加目录”的“实际路径”:因为目录可能是 Symlink(符号链接);
      如上:“/bin/bash”就是指向“/usr/bin/bash”的符号链接。
    3. 开启站点的“防止跨站攻击”,并配置“.user.ini”文件:
      open_basedir=/www/wwwroot/wiki.eijux.com/:/tmp/:/usr/bin/bash
      
    4. 访问站点的文章页面,以确定不再有“open_basedir 问题”。
【2022/08/23 17:47:44 验证】


.user.ini”:用于配置“open_basedir”

1、开启“防止跨站攻击”后自动生成。(位于项目根目录)

2、关闭“防止跨站攻击”自动删除;

3、不能被上传覆盖,只能在服务器修改;


可以通过宝塔面板来修改宝塔面板:修改“.user.ini”.png

页面显示无格式

访问所有页面都只有文字,没有格式。如图:

    MediaWiki:“$wgScriptPath”设置导致页面显示格式不对.png

解决:

  1. 检查本地网络环境;
  2. 检查系统配置文件(“LocalSettings.php”)中的“$wgScriptPath[2]”配置。
    • $wgScriptPath”的配置与 MediaWiki 安装路径不匹配,会导致无法获取 MediaWiki 的各个脚本,从而出现上述情况。

SVG[3] 缩略图问题

初次上传 svg(矢量图)时,遇到了几个问题,基本上都是由于配置不完全导致。

“无法创建临时缩略图文件”

上传“.svg”文件后:

1、页面提示:“生成缩略图出错:无法创建临时缩略图文件”。

2、在“特殊:文件列表”中查看文件时,提示:“Warning: symlink() has been disabled for security reasons in /www/wwwroot/wiki.eijux.com/includes/media/SvgHandler.php on line 280”。

解决: 在服务器的 PHP 配置中,将禁用的函数“symlink()[4]”删除。


“sh: convert: command not found”

生成缩略图处提示:sh: convert: command not found

Mediawiki 支持 SVG 图像呈现:如果启用,SVG 图像可以像其他图像文件一样使用 —— 它们将自动呈现为 PNG 文件,并根据需要动态缩略图。

MediaWiki 默认没有安装任何“转换器”(Converter[5]),以下选择安装“NativeSvgHandler[6]”。

解决:

  1. 下载“NativeSvgHandler”到服务器(“./extensions/”)中;
    • 注意修改所有者及读写权限。
  2. 配置启动(LocalSettings.php 中):
    wfLoadExtension( 'NativeSvgHandler' );
    

再于网页刷新,svg 缩略图显示正常。


“Warning: is_executable(): open_basedir ……”

PHP 错误信息为:Warning: is_executable(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/www/wwwroot/wiki.eijux.com/:/tmp/) in /www/wwwroot/wiki.eijux.com/includes/shell/Command.php on line 311

解决: 参考:“#open_basedir 问题”。

参考

  1. 位于:“/www/wwwlogs/wiki.eijux.com.error.log”。
  2. 手册:LocalSettings#$wgScriptPath
  3. 参考:Manual:Image administration#SVG
  4. 默认情况下,是被禁用的函数。可以使用“宝塔面板快速设置。”
  5. Converter("ImageMagick", "ImagickExt", "sodipodi", "inkscape", "batik", "rsvg", and "imgserv")均需单独安装。
  6. 插件“NativeSvgHandler”:将 SVG 文件直接发送至客户端以进行客户端渲染。
    参考:Extension:NativeSvgHandler