查看“︁MediaWiki页面显示Nginx404”︁的源代码
←
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></code> 以及访问尚未创建的普通页面时也会出现 404,例如: <code><nowiki>https://wiki.example.com/index.php?title=Test</nowiki></code> 表面上看,问题似乎像是 MediaWiki 的特殊页面、本地化别名、URL 重写或 Nginx 伪静态规则出了问题。 但进一步检查后发现,真正的问题并不是 MediaWiki 没有处理请求,而是 Nginx 把 MediaWiki 返回的应用内 404 页面覆盖掉了。 == 排查过程 == 首先使用 curl 测试英文特殊页面: <code>curl -I "<nowiki>https://wiki.example.com/index.php?title=Special:RecentChanges</nowiki>"</code> 返回结果中可以看到,MediaWiki 实际上已经识别了这个特殊页面,并将其重定向到了中文特殊页名称: <code>HTTP/2 301 location: <nowiki>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</nowiki></code> 这说明 MediaWiki 本身是工作的,<code>Special:RecentChanges</code> 也能被识别。 然后继续跟随跳转查看页面正文: <code>curl -L "<nowiki>https://wiki.example.com/index.php?title=Special:RecentChanges</nowiki>" | head -n 50</code> 返回内容却是: <code><html> <head><title>404 Not Found</title></head> <body> <nowiki><center><h1>404 Not Found</h1></nowiki><nowiki></center></nowiki> <nowiki><hr></nowiki><nowiki><center>nginx</center></nowiki> </body> </html></code> 这里的关键点是: <code>nginx</code> 如果是 MediaWiki 自己返回的页面,HTML 中通常会包含 MediaWiki 的页面结构、皮肤、站点标题等内容;而这里显示的是 Nginx 默认 404 页面。 因此可以判断:这个 404 不是 MediaWiki 页面本身,而是被 Nginx 的错误页处理逻辑替换了。 == 根本原因 == 在宝塔面板生成的 Nginx 配置中,存在如下配置: <code>error_page 404 /404.html;</code> 完整片段类似: <code>#ERROR-PAGE-START 错误页配置,可以注释、删除或修改 error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END</code> 这个配置的含义是:只要后端返回 HTTP 404,Nginx 就将页面替换为 <code>/404.html</code>。 这对于普通静态网站可能没问题,但对 MediaWiki 这类动态应用来说会造成误伤。 MediaWiki 在很多情况下会主动返回 HTTP 404 状态码,但页面正文并不是错误,而是应用内的正常提示。例如: * 访问尚未创建的页面; * 访问不存在的标题; * 某些特殊页面或查询结果为空的页面; * 需要由 MediaWiki 自己生成的“页面不存在,可创建此页面”提示。 也就是说,对于 MediaWiki 来说,HTTP 404 并不一定代表 Nginx 层面的文件不存在。它可能只是 MediaWiki 用来表达“这个 wiki 页面尚未创建”的正常状态码。 但是 Nginx 的: <code>error_page 404 /404.html;</code> 会把 MediaWiki 自己生成的页面内容覆盖掉,最终用户看到的就不再是 MediaWiki 的提示,而是 Nginx 的: <code>404 Not Found nginx</code> 这就是导致“未创建页面打不开”“部分特殊页面变成 404”的真正原因。 == 解决方法 == 编辑站点的 Nginx 配置文件,例如宝塔环境下通常位于: <code>/www/server/panel/vhost/nginx/wiki.example.com.conf</code> 找到: <code>error_page 404 /404.html;</code> 将其注释掉: <code>#error_page 404 /404.html;</code> 修改后的配置应类似: <code>#ERROR-PAGE-START 错误页配置,可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END</code> 然后测试 Nginx 配置: <code>sudo nginx -t</code> 如果显示配置正常,再重载 Nginx: <code>sudo systemctl reload nginx</code> 宝塔环境也可以使用: <code>sudo /etc/init.d/nginx reload</code> == 修复后的效果 == 修改后,再访问未创建页面: <code><nowiki>https://wiki.example.com/index.php?title=Test</nowiki></code> 它可能仍然返回 HTTP 404 状态码,这是正常的,因为 <code>Test</code> 页面确实尚未创建。 但页面正文不应再是 Nginx 的: <code>404 Not Found nginx</code> 而应该变成 MediaWiki 自己的提示页面,例如: <code>此页面目前没有内容。 您可以搜索本页标题、在相关页面中搜索,或者创建此页面。</code> 也就是说,判断问题是否修复,不能只看 HTTP 状态码是否为 404,而要看页面正文到底是 MediaWiki 生成的,还是 Nginx 生成的。 可以用下面的命令检查: <code>curl -L "<nowiki>https://wiki.example.com/index.php?title=Test</nowiki>" | head -n 30</code> 如果输出中出现 MediaWiki 页面结构,说明已经正常。 == 推荐的 MediaWiki Nginx 基础配置 == 对于使用 <code>/index.php?title=页面名</code> 这种默认 URL 形式的 MediaWiki 站点,可以保留简单的基础转发规则: <code>location / { try_files $uri $uri/ /index.php?$query_string; }</code> 同时建议在 <code>LocalSettings.php</code> 中明确使用保守的 URL 配置: <code>$wgScriptPath = ""; $wgArticlePath = "/index.php?title=$1"; $wgUsePathInfo = false; $wgServer = "<nowiki>https://wiki.example.com</nowiki>";</code> 这样可以避免 MediaWiki 生成 <code>/index.php/PageName</code> 或短链接形式的路径,从而减少和 Nginx URL 重写规则冲突的概率。 == 关于未创建页面的 404 状态码 == 需要特别注意:MediaWiki 中访问未创建页面返回 HTTP 404 是正常行为。 例如: <code><nowiki>https://wiki.example.com/index.php?title=Test</nowiki></code> 如果 <code>Test</code> 页面尚未创建,MediaWiki 可以返回 404 状态码,同时显示“页面不存在,可创建此页面”的提示。 因此,排查时不能简单认为: <code>HTTP 404 = Nginx 配置错误</code> 更准确的判断方式是: * 如果页面正文是 MediaWiki 风格的“页面不存在”提示,说明正常; * 如果页面正文是 <code>404 Not Found nginx</code>,说明被 Nginx 错误页覆盖了; * 如果访问 <code>/index.php</code> 本身也 404,才更可能是站点根目录或 PHP 转发规则错误。 == 总结 == 这次问题的关键不在 MediaWiki 数据库,也不在特殊页面本身,而是在 Nginx 配置中的: <code>error_page 404 /404.html;</code> 该配置会覆盖 MediaWiki 自己生成的 404 页面,导致: * 未创建页面无法显示 MediaWiki 的创建提示; * 部分特殊页面看起来像是 Nginx 404; * 排查方向容易误判为 URL 重写、PathInfo 或 MediaWiki 本地化问题。 最终解决方法很简单: <code>#error_page 404 /404.html;</code> 对 MediaWiki、DokuWiki、WordPress 等动态应用来说,通常不建议让 Nginx 直接覆盖应用层返回的 404 页面。应用自己的 404 页面往往包含有用的操作入口、创建页面提示、搜索入口或权限提示。如果被 Nginx 统一替换,会破坏应用的正常交互逻辑。 [[分类:MediaWiki]]
返回
MediaWiki页面显示Nginx404
。
导航菜单
个人工具
创建账号
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息