Can anyone please help me set up nginx rewrite rules for multiple wikis with a common installation? I have a separate wiki for each language. E.g.
example.org/wiki/en example.org/wiki/fr/
Problem: Both wikis load with the correct URLs, but any action re-directs to the English wiki.
E.g. creating a new page on the French (i.e. example.org/wiki/fr/) wiki re-directs to the English (i.e. example.org/wiki/en/) wiki. And if I try to create `Main_page` on the French wiki, it re-directs and opens editing the existing Main_page on the English wiki @ example.org/wiki/en/Main_Page.
How do I rectify this? Thanks in advance, I am completely stumped and any help will be GREATLY appreciated.
nginx config:
server { ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
listen 443 ssl; server_name example.org; root /srv/live/static/example.org/www; # wiki is not root page
access_log /var/log/nginx/example.org/access.log; error_log /var/log/nginx/example.org/error.log;
location ^~ /wiki/ { alias /srv/live/php/mediawiki-1.42.1/;
# Redirect /wiki/ to /wiki/en/ location = /wiki/ { return 301 $scheme://$host/wiki/en/; }
try_files $uri $uri/ @mediawiki;
# PHP handling for wiki location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param MW_DB $arg_lang; include fastcgi_params; } }
location @mediawiki { set $lang 'en'; if ($uri ~ "^/wiki/(en|fr)/") { set $lang $1; }
set $wiki_id 'example_org_en'; if ($lang = 'fr') { set $wiki_id 'example_org_fr'; }
rewrite "^/wiki/([a-z]{2})/(.*)$" /wiki/index.php?title=$2&lang=$1 last; fastcgi_param MW_DB $wiki_id; } }
LocalSettings.php
<?php # Protect against web entry if ( !defined( 'MEDIAWIKI' ) ) { exit; } # Multi-wiki configuration $wgConf = new SiteConfiguration();
$wikiLangMap = [ 'example_org_en' => 'en', 'example_org_fr' => 'fr', ]; $wgConf->wikis = array_keys($wikiLangMap); $wgConf->settings = [ 'wgServer' => [ 'default' => 'https://example.org', ], 'wgSitename' => [ 'default' => 'example Wiki', ], 'wgLanguageCode' => $wikiLangMap, 'wgDBprefix' => [ 'example_org_en' => 'example_org_en_', 'example_org_fr' => 'example_org_fr_', ], ]; # Determine the current wiki $wikis = [ 'example.org/wiki/en' => 'example_org_en', 'example.org/wiki/fr' => 'example_org_fr', ]; if ( defined( 'MW_DB' ) ) { $wikiID = MW_DB; } else { $uri = $_SERVER['REQUEST_URI'] ?? ; $parts = explode('/', trim($uri, '/')); $lang = $parts[1] ?? 'en'; // Default to 'en' if not specified $wikiID = $wikis["example.org/wiki/$lang"] ?? 'example_org_en'; } # Apply the settings $wgConf->extractAllGlobals( $wikiID ); # Common settings $wgScriptPath = '/wiki'; $wgResourceBasePath = $wgScriptPath; $wgArticlePath = "/wiki/$wgLanguageCode/$1"; $wgLogos = [ '1x' => "$wgResourceBasePath/resources/assets/change-your-logo.svg", 'icon' => "$wgResourceBasePath/resources/assets/change-your-logo.svg", ]; $wgEnableEmail = true; $wgEnableUserEmail = true; $wgEmergencyContact = ; $wgPasswordSender = ; $wgEnotifUserTalk = true; $wgEnotifWatchlist = true; $wgEmailAuthentication = true; ## Database settings $wgDBtype = 'mysql'; $wgDBserver = 'localhost'; $wgDBname = 'mediawiki_docs_db'; $wgDBuser = 'wiki_example_org'; $wgDBpassword = 'password'; # MySQL specific settings $wgDBssl = false; $wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary"; # the rest are defaults, will post if requested!
.../mediawiki-1.42.1/settings/example.org/LocalSettings.en.php
<?php $wgLanguageCode = 'en'; $wgSitename = 'example.org Wiki';
.../mediawiki-1.42.1/settings/example.org/LocalSettings.fr.php
<?php $wgLanguageCode = 'fr'; $wgSitename = 'example.org Wiki';