Apache单实例MediaWiki子域本地化翻译配置求助
实现MediaWiki子域本地化的.htaccess方案
没问题,这个需求完全可以通过Apache的mod_rewrite模块配合.htaccess来实现,同时需要和MediaWiki的页面命名规则配合。我给你详细拆解步骤:
前提准备
首先要确保你的语言子域(比如fr.example.com)已经正确解析到和主域example.com相同的服务器Web根目录,这样.htaccess的规则才能生效。另外,Apache服务器需要开启mod_rewrite模块,并且在虚拟主机配置中设置AllowOverride All,允许.htaccess文件覆盖配置。
.htaccess重写规则
在你的Web根目录的.htaccess文件中(如果已经有MediaWiki友好URL的规则,把下面的规则放在现有规则的最前面),添加以下内容:
# 开启重写引擎 RewriteEngine On # 匹配两位语言代码的子域(如fr、es、en),排除主域和www子域 RewriteCond %{HTTP_HOST} ^([a-z]{2})\.example\.com$ [NC] # 避免直接访问index.php时触发循环 RewriteCond %{REQUEST_URI} !^/index\.php [NC] # 将子域的语言代码追加到请求路径末尾,内部重写至对应翻译页面 RewriteRule ^(Wiki/.*)$ /$1/%1 [L]
规则解释
RewriteCond %{HTTP_HOST} ^([a-z]{2})\.example\.com$ [NC]:捕获URL中的两位语言代码(比如fr),[NC]表示不区分大小写,兼容FR.example.com这类访问。RewriteCond %{REQUEST_URI} !^/index\.php [NC]:排除直接访问index.php的请求,防止重写循环。RewriteRule ^(Wiki/.*)$ /$1/%1 [L]:把请求路径(比如Wiki/Page)重写为Wiki/Page/fr(%1对应前面捕获的语言代码),[L]表示这是最后一条匹配的规则,停止后续处理。
MediaWiki配合设置
要确保你的翻译页面是按照Page/fr、Page2/fr的命名规则创建的(这也是MediaWiki多语言页面的常规命名方式)。如果使用了Translate扩展,要确保翻译页面的命名和这个规则一致,这样重写后的URL才能正确匹配到对应的翻译内容。
另外,如果你希望子域访问时自动设置界面语言,可以在MediaWiki的LocalSettings.php中添加以下代码,根据子域设置当前语言:
// 从子域提取语言代码 $host = $_SERVER['HTTP_HOST']; if (preg_match('/^([a-z]{2})\.example\.com$/i', $host, $matches)) { $wgLanguageCode = $matches[1]; }
测试与排查
- 访问
https://fr.example.com/Wiki/Page,检查是否正确加载https://example.com/Wiki/Page/fr的内容。 - 如果出现404错误,先检查子域解析是否正确,然后确认Apache的
mod_rewrite是否开启,AllowOverride All是否配置正确。 - 如果出现循环重定向,检查.htaccess中是否有其他规则冲突,确保上述规则放在最前面。
内容的提问来源于stack exchange,提问作者mapple
相关产品推荐
相关产品推荐

