MediaWiki页面显示Nginx404:修订间差异

来自懒狗维基
跳转到导航 跳转到搜索
无编辑摘要
无编辑摘要
 
第141行: 第141行:


[[分类:MediaWiki]]
[[分类:MediaWiki]]
[[分类:技术博客]]

2026年6月11日 (四) 06:02的最新版本

MediaWiki 页面显示 Nginx 404 的排查记录:error_page 404 导致的隐藏问题

问题现象

在安装并配置好 MediaWiki 后,首页可以正常打开,部分特殊页面也可以正常访问,例如:

https://wiki.example.com/index.php?title=特殊:上传文件

但是访问另一些页面时却出现 404,例如:

https://wiki.example.com/index.php?title=特殊:最近更改

以及访问尚未创建的普通页面时也会出现 404,例如:

https://wiki.example.com/index.php?title=Test

表面上看,问题似乎像是 MediaWiki 的特殊页面、本地化别名、URL 重写或 Nginx 伪静态规则出了问题。

但进一步检查后发现,真正的问题并不是 MediaWiki 没有处理请求,而是 Nginx 把 MediaWiki 返回的应用内 404 页面覆盖掉了。

排查过程

首先使用 curl 测试英文特殊页面:

curl -I "https://wiki.example.com/index.php?title=Special:RecentChanges"

返回结果中可以看到,MediaWiki 实际上已经识别了这个特殊页面,并将其重定向到了中文特殊页名称:

HTTP/2 301
location: https://wiki.example.com/index.php?title=%E7%89%B9%E6%AE%8A:%E6%9C%80%E8%BF%91%E6%9B%B4%E6%94%B9

这说明 MediaWiki 本身是工作的,Special:RecentChanges 也能被识别。

然后继续跟随跳转查看页面正文:

curl -L "https://wiki.example.com/index.php?title=Special:RecentChanges" | head -n 50

返回内容却是:

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

这里的关键点是:

nginx

如果是 MediaWiki 自己返回的页面,HTML 中通常会包含 MediaWiki 的页面结构、皮肤、站点标题等内容;而这里显示的是 Nginx 默认 404 页面。

因此可以判断:这个 404 不是 MediaWiki 页面本身,而是被 Nginx 的错误页处理逻辑替换了。

根本原因

在宝塔面板生成的 Nginx 配置中,存在如下配置:

error_page 404 /404.html;

完整片段类似:

#ERROR-PAGE-START  错误页配置,可以注释、删除或修改
error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

这个配置的含义是:只要后端返回 HTTP 404,Nginx 就将页面替换为 /404.html

这对于普通静态网站可能没问题,但对 MediaWiki 这类动态应用来说会造成误伤。

MediaWiki 在很多情况下会主动返回 HTTP 404 状态码,但页面正文并不是错误,而是应用内的正常提示。例如:

  • 访问尚未创建的页面;
  • 访问不存在的标题;
  • 某些特殊页面或查询结果为空的页面;
  • 需要由 MediaWiki 自己生成的“页面不存在,可创建此页面”提示。

也就是说,对于 MediaWiki 来说,HTTP 404 并不一定代表 Nginx 层面的文件不存在。它可能只是 MediaWiki 用来表达“这个 wiki 页面尚未创建”的正常状态码。

但是 Nginx 的:

error_page 404 /404.html;

会把 MediaWiki 自己生成的页面内容覆盖掉,最终用户看到的就不再是 MediaWiki 的提示,而是 Nginx 的:

404 Not Found
nginx

这就是导致“未创建页面打不开”“部分特殊页面变成 404”的真正原因。

解决方法

编辑站点的 Nginx 配置文件,例如宝塔环境下通常位于:

/www/server/panel/vhost/nginx/wiki.example.com.conf

找到:

error_page 404 /404.html;

将其注释掉:

#error_page 404 /404.html;

修改后的配置应类似:

#ERROR-PAGE-START  错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

然后测试 Nginx 配置:

sudo nginx -t

如果显示配置正常,再重载 Nginx:

sudo systemctl reload nginx

宝塔环境也可以使用:

sudo /etc/init.d/nginx reload

修复后的效果

修改后,再访问未创建页面:

https://wiki.example.com/index.php?title=Test

它可能仍然返回 HTTP 404 状态码,这是正常的,因为 Test 页面确实尚未创建。

但页面正文不应再是 Nginx 的:

404 Not Found
nginx

而应该变成 MediaWiki 自己的提示页面,例如:

此页面目前没有内容。
您可以搜索本页标题、在相关页面中搜索,或者创建此页面。

也就是说,判断问题是否修复,不能只看 HTTP 状态码是否为 404,而要看页面正文到底是 MediaWiki 生成的,还是 Nginx 生成的。

可以用下面的命令检查:

curl -L "https://wiki.example.com/index.php?title=Test" | head -n 30

如果输出中出现 MediaWiki 页面结构,说明已经正常。

推荐的 MediaWiki Nginx 基础配置

对于使用 /index.php?title=页面名 这种默认 URL 形式的 MediaWiki 站点,可以保留简单的基础转发规则:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

同时建议在 LocalSettings.php 中明确使用保守的 URL 配置:

$wgScriptPath = "";
$wgArticlePath = "/index.php?title=$1";
$wgUsePathInfo = false;
$wgServer = "https://wiki.example.com";

这样可以避免 MediaWiki 生成 /index.php/PageName 或短链接形式的路径,从而减少和 Nginx URL 重写规则冲突的概率。

关于未创建页面的 404 状态码

需要特别注意:MediaWiki 中访问未创建页面返回 HTTP 404 是正常行为。

例如:

https://wiki.example.com/index.php?title=Test

如果 Test 页面尚未创建,MediaWiki 可以返回 404 状态码,同时显示“页面不存在,可创建此页面”的提示。

因此,排查时不能简单认为:

HTTP 404 = Nginx 配置错误

更准确的判断方式是:

  • 如果页面正文是 MediaWiki 风格的“页面不存在”提示,说明正常;
  • 如果页面正文是 404 Not Found nginx,说明被 Nginx 错误页覆盖了;
  • 如果访问 /index.php 本身也 404,才更可能是站点根目录或 PHP 转发规则错误。

总结

这次问题的关键不在 MediaWiki 数据库,也不在特殊页面本身,而是在 Nginx 配置中的:

error_page 404 /404.html;

该配置会覆盖 MediaWiki 自己生成的 404 页面,导致:

  • 未创建页面无法显示 MediaWiki 的创建提示;
  • 部分特殊页面看起来像是 Nginx 404;
  • 排查方向容易误判为 URL 重写、PathInfo 或 MediaWiki 本地化问题。

最终解决方法很简单:

#error_page 404 /404.html;

对 MediaWiki、DokuWiki、WordPress 等动态应用来说,通常不建议让 Nginx 直接覆盖应用层返回的 404 页面。应用自己的 404 页面往往包含有用的操作入口、创建页面提示、搜索入口或权限提示。如果被 Nginx 统一替换,会破坏应用的正常交互逻辑。