MediaWiki URL中mod-rewrite跳转至实际文件的问题求助
解决MediaWiki URL重写与真实文件冲突的问题
嘿,我来帮你搞定这个MediaWiki的URL重写冲突问题!首先得明确两个关键点:一是Apache的默认优先级会优先处理真实存在的文件/目录,跳过MediaWiki的重写规则;二是直接能访问LocalSettings.php本身就是个安全风险——这个文件存着数据库密码等敏感信息,绝对不能对外暴露。我们分两步来解决:
1. 先堵住LocalSettings.php的访问漏洞
在你的MediaWiki根目录的.htaccess文件里,加上这段规则,直接禁止外部访问这个敏感文件:
<Files "LocalSettings.php"> Require all denied </Files>
加完之后,再访问http://10.0.0.160/wiki/LocalSettings.php就会返回403禁止访问,既解决了安全问题,也避免了跳转到真实文件的情况。
2. 调整重写规则,让Wiki页面优先于真实文件
如果你还有其他和真实文件/目录同名的Wiki页面需要访问,就得修改重写规则,让MediaWiki的路由优先级更高(除了必要的静态资源,比如样式、图片这些)。
打开MediaWiki根目录的.htaccess,替换掉现有的重写规则,改成下面这样:
# 启用重写引擎 RewriteEngine On # 放行静态资源请求(样式、图片、扩展文件等),保证网站正常加载 RewriteRule ^(skins|images|extensions|resources|vendor)/ - [L] # 保护敏感配置文件 <Files "LocalSettings.php"> Require all denied </Files> # 所有其他请求,不管有没有对应的真实文件/目录,都交给MediaWiki处理 RewriteRule ^(.*)$ index.php/$1 [L]
简单解释下规则:
- 第一条
RewriteRule专门处理静态资源,让这些文件直接返回,不经过MediaWiki,保证网站的样式、图片能正常显示; - 中间的
<Files>块就是刚才加的安全防护; - 最后一条规则把所有其他请求都转发到MediaWiki的入口文件,这样就算有同名的真实文件,也会优先显示对应的Wiki文章。
更简洁的备选方案(Apache 2.2.16+可用)
如果你的Apache版本是2.2.16或更高,可以用FallbackResource指令替代复杂的重写规则,代码更简洁:
RewriteEngine On # 保护敏感文件 <Files "LocalSettings.php"> Require all denied </Files> # 放行静态资源 RewriteRule ^(skins|images|extensions|resources|vendor)/ - [L] # 所有非静态资源请求都自动转到MediaWiki入口 FallbackResource /wiki/index.php
这个指令的作用是,当请求的路径不存在时自动转发到指定入口,结合前面的静态资源放行规则,同样能实现我们要的效果。
最后,修改完.htaccess后,记得重启Apache服务让配置生效,然后去测试那些和真实文件同名的Wiki页面,应该就能正常显示对应的文章啦!
内容的提问来源于stack exchange,提问作者user5549921
相关产品推荐
相关产品推荐

