User:Fo0bar/MediaWiki root articles

One of my pet peeves is seeing wiki URLs such as http://www.example.com/wiki/index.php/Main_Page. There are many recipes out there for shortening that to "Wikipedia-style" URLs such as http://www.example.com/wiki/Main_Page, but I wanted to take it further. I wanted simply http://www.example.com/ to be the home page, and http://www.example.com/Other_Article to be a normal article.

Installation

edit
  • Set up a normal MediaWiki installation in the directory /w under the document root.
  • Edit /w/LocalSettings.php.
  • Edit the virtual host's .htaccess.

LocalSettings.php configuration

edit
$wgScriptPath = "/w";
$wgArticlePath = "/$1";

.htaccess configuration

edit
<IfModule mod_rewrite.c>
# Turn on mod_rewrite
RewriteEngine On

# If you are converting from a static site to a wiki,
# you'll want to make redirections to the new article.
RewriteRule ^old-file.html$ http://www.example.com/New_Article [R=permanent,L]

# This hack lets you essentially gets rid of the redirection
# to "Main Page".  Conversely, if you go to http://www.example.com/Main_Page,
# it sends an permanent external redirection to http://www.example.com/.
RewriteRule ^Main_Page$ http://www.example.com/ [R=permanent,L]
RewriteRule ^$ /w/index.php?title=Main_Page&redirect=no [QSA,L]

# Finally, if we've gotten this far, process it as if it's an article,
# UNLESS it's a physical file/directory/symlink.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /w/index.php?title=$1 [QSA,L]
</IfModule>

One step further: action URL rewrites

edit

The above process makes the article URLs look pretty, but index.php is still referenced in most actions. To solve that, we can use mod_rewrite to map to better URLs, and tell MediaWiki to use them for actions. In this guide, http://www.example.com/w/index.php?title=Main_Page&action=edit becomes http://www.example.com/w/action/edit/Main_Page.

LocalSettings.php configuration

edit
foreach($wgActions as $action => $value) {
  if($value === false) { continue; }
  if($action == 'raw') { continue; }
  $wgActionPaths[$action] = "$wgScriptPath/action/$action/$1";
}
$wgActionPaths['view'] = $wgArticlePath;

.htaccess configuration

edit

Insert the following above the RewriteConds above:

RewriteRule ^w/action/([a-z]*)/(.*)$ /w/index.php?action=$1&title=$2 [QSA,L]