MediaWiki页面显示Nginx404:修订间差异
创建页面,内容为“= MediaWiki 页面显示 Nginx 404 的排查记录:error_page 404 导致的隐藏问题 = == 问题现象 == 在安装并配置好 MediaWiki 后,首页可以正常打开,部分特殊页面也可以正常访问,例如: <code><nowiki>https://wiki.example.com/index.php?title=特殊:上传文件</nowiki></code> 但是访问另一些页面时却出现 404,例如: <code><nowiki>https://wiki.example.com/index.php?title=特殊:最近更改</nowiki></co…” |
无编辑摘要 |
||
| 第139行: | 第139行: | ||
<code>#error_page 404 /404.html;</code> | <code>#error_page 404 /404.html;</code> | ||
对 MediaWiki、DokuWiki、WordPress 等动态应用来说,通常不建议让 Nginx 直接覆盖应用层返回的 404 页面。应用自己的 404 页面往往包含有用的操作入口、创建页面提示、搜索入口或权限提示。如果被 Nginx 统一替换,会破坏应用的正常交互逻辑。 | 对 MediaWiki、DokuWiki、WordPress 等动态应用来说,通常不建议让 Nginx 直接覆盖应用层返回的 404 页面。应用自己的 404 页面往往包含有用的操作入口、创建页面提示、搜索入口或权限提示。如果被 Nginx 统一替换,会破坏应用的正常交互逻辑。 | ||
[[分类:MediaWiki]] | |||
2026年6月11日 (四) 05:41的版本
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 统一替换,会破坏应用的正常交互逻辑。