Manual:Short URL


 * See Manual:Short URL overview if you find below confusing

According to World Wide Web inventor Al Gore Tim Berners-Lee, good URLs should never change. Short URLs which hide PHP mechanics from the browser address bar is good user interface.

MediaWiki does not have Short URLs by default because short URLs work with Web server configurations that vary depending on the specific Web server and hosting account being used.

In all the below examples, it is assumed that MediaWiki is installed in the directory located at  and that you want to use   as an alias for. It is possible to use an alternative install directory and an alternative alias simply by changing these values ("wiki" and "w") in the examples below. The process is slightly more complicated if you want both to be the same, or if you want the alias to be the root directory ("" instead of "wiki"), but in both cases it is possible with a bit of tweaking (and a few usage restrictions).

Shared Hosting: If you are using shared hosting it is unlikely you will have root access to the server. You may or may not be able to use any of the techniques that follow. Start by opening a ticket with your hosting provider. Ask a how to get rid of the "index.php?title=" for all pages and they may well solve your problem for you.

Shortened article path
See Manual:Short URL overview for methods of shortening your mediawiki URL with and without root access.

Subdomain with no Subdirectory in Article URL using mod-rewrite
Apache's mod-rewrite can be used to allow the shortest URL's of just http://yourdomain/pagename. Mod-rewrite changes the illegally formatted "friendly" URL request into a legitimate request directed at the index.php script like usual. To use mod-rewrite, specify a condition pattern, and a transformation rule to apply to the URL if it matches the condition pattern, such as in the following example: RewriteEngine On   RewriteCond %{REQUEST_URI} !^/w.*/ RewriteRule ^/(.*) /wiki/index.php/$1 [L] This re-write condition says not to touch any URL's which start with a lowercase W and start and finish with a forward slash, this protects all old-style article requests, and requests to internal MediaWiki files like scripts or images. By not specifically using the term wiki in the condition allows other directories of web documents outside the wiki such as /www/media

The re-write rule then assumes everything after the leading slash to be an article name and reformats the URL accordingly. Also $wgArticlePath = "/$1" is set in LocalSettings.php to make the friendly form the default way of rendering links. Links involving a query-string will use the usual format.

This uses the technique for evading the Manual:Short URL described below.

Subdomain with no Subdirectory in Article URL using Lighttpd
To put MediaWiki in a root directory with the Lighttpd webserver, use the following rule (assuming mod_rewrite is loaded):

url.rewrite-once = (   "(^/[^:]*[\./].*)" => "$1",    "^/([^?]*)(?:\?(.*))?" => "/wiki/index.php?title=$1&$2", )

If you want to host this on a seperate domain (which is very likely for a wiki in the root-dir) do:

$HTTP["host"] == "wiki.example.com" { server.document-root = "/path/to/webroot" url.rewrite-once = (       "(^/[^:]*[\./].*)" => "$1",        "^/([^?]*)(?:\?(.*))?" => "/wiki/index.php?title=$1&$2",    ) }

If you want to allow ampersands in titles too (or any other character that might be considered an argument delimiter in the query string) you can make a more complicated rule using mod_magnet. For more information, see lighttpd's documentation about mod_magnet on their website.

Enabling a wiki on the root URL, a secondary wiki, and a rails app using Apache Rewrite
This shows how to enable a wiki on the root URL, a secondary wiki on a descendant URL, and a rails app with clean structure.

Example URL structure http://example.com/ http://example.com/wiki_main/index.php?title=Main_Page http://example.com/Special:Recentchanges http://example.com/wiki_main/Special:Recentchanges http://example.com/wiki_main/index.php?title=Special:Recentchanges
 * Primary wiki - Main page
 * Primary wiki - Special:Recentchanges

http://example.com/wiki_other/Main_Page http://example.com/wiki_other/index.php?title=Main_Page
 * Secondary wiki - Main page

http://example.com/wiki_other/Special:Recentchanges http://example.com/wiki_other/index.php?title=Special:Recentchanges
 * Secondary wiki - Special:Recentchanges

http://example.com/weblog/ http://example.com/weblog/controller
 * Rails application

Pertinent directory structure web/ example_com/ cgi-bin/ htdocs/ .htaccess weblog -> ../rails/public weblog.html wiki_main/ .htaccess LocalSettings.php [usual mediawiki files] wiki_other/ .htaccess LocalSettings.php [usual mediawiki files] rails/ blogapp/ .htaccess app/ config/ db/ public/ vendor/

weblog is a symbolic link to /web/example_com/rails/blogapp/public.

Contents of /web/example_com/htdocs/.htaccess Options FollowSymLinks RewriteEngine On

RewriteCond %{REQUEST_URI} ^/Main_Page RewriteRule ^(.*) / [R,L]
 * 1) Hide Main_Page from URL

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/wiki_main/ RewriteRule ^(.*) /wiki_main/index.php/$1 [L]
 * 1) If the file is real, skip this rule

RewriteRule ^$ /wiki_main/index.php/Main_Page  [PT,L]
 * 1) http://example.com displays the front page of the primary wiki

Options FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?title=$1 [L,QSA]
 * Contents of /web/example_com/htdocs/wiki_main/.htaccess
 * Contents of /web/example_com/htdocs/wiki_other/.htaccess

Modifications to /web/example_com/htdocs/wiki_main/LocalSettings.php $wgArticlePath = "/$1";

Modifications to /web/example_com/htdocs/wiki_other/LocalSettings.php $wgArticlePath = "$wgScriptPath/$1";

Contents of /web/example_com/htdocs/weblog.html</tt>

<meta http-equiv="Refresh" content="0; url=http://example.com/weblog/" />

IIS6 and ShortURL support
IIS6 requires an ISAPI URL Rewrite filter to work. Several commercial filters are available. An open source ISAPI filter is available for free from http://www.codeplex.com/IIRF called Ionic's Isapi Rewrite Filter (IIRF). As of August 2007, IIRF version 1.2.12c is known to work with MediaWiki 10.1 using IIS6 under Windows Server 2003 SP1. It is likely that other IIS implementations are supported, as IIRF is also IIS 5.0 (Windows 2000) and IIS 5.1 (Windows XP) compatible.
 * Installation instructions are available from IIRF's website in the download package.
 * IIRF has a comprehensive forum providing install support.
 * To successfully configure IIRF, an INI file must be customized for MediaWiki. See below for details.

Sample INI file code for MediaWiki at wiki.domain.com/wiki/: (IsapiRewrite4.ini, stored in same path as IsapiRewrite4.dll) RewriteLog c:\temp\iirfLog.out RewriteLogLevel 3 MaxMatchCount 1 RewriteEngine On

RewriteCond %{HTTP_HOST} ^wiki.domain.com
 * 1) Change to suit your domain

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
 * 1) Checks for local file existance so that .css, .js and other MediaWiki files aren't processed

RewriteRule ^/wiki/(.*)$ /wiki/index.php?title=$1 [I,L] IterationLimit 4

See also: URL rewrite in IIS

Prevent bots from crawling index.php
You can make sure that search engines only index actual wiki pages, without indexing action views (such as edit or history pages, with URLs in the form ). Note that doing this without implementing short URLs will block all pages from being indexed.

Create a file named robots.txt</tt> in the root of your MediaWiki installation with the following content. User-agent: * Disallow: /index.php

Ignoring the Trailing slash
When a page is accessed with a trailing slash MediaWiki sees it as a different page - (Named Page/</tt> instead of Page</tt>). You may want to consider this solution.

~/web_root/.htaccess
Options FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?title=$1 [L,QSA]

~/web_root/LocalSettings.php
$wgArticlePath = "$wgScriptPath/$1"; $GLOBALS['_REQUEST']['title'] = preg_replace("/^(.+)\/$/", "$1", $GLOBALS['_REQUEST']['title']);

Allowing for escaped characters in URI
It may happen that you only have access to the .htaccess</tt> file, and you would like to allow special characters such as +</tt> in the article title, and you are using Apache 2.x. LocalSettings.php therefore contains

~/web_root/w/LocalSettings.php
while .htaccess</tt> contains something like

~/web_root/.htaccess
RewriteEngine on RewriteBase /

RewriteRule ^wiki$ wiki/Main_Page [R,NC] RewriteRule ^wiki/$ wiki/Main_Page [R,NC]

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /wiki/([^?\ ]+) RewriteRule ^wiki/(.+)$ /w/index.php?title=%1 [NE,L,QSA]

The use of RewriteCond %{THE_REQUEST}...</tt> catches the query before Apache and PHP conspire to replace %2B</tt> in the URL with a space.

Repeated directory errors
Should you receive looping alias/rewrite errors such as: 'Cannot find page www.example.com/wiki/wiki/wiki/wiki/wiki/ [...] /index.php' check that $wgserver does not contain any over-lapping path with the $wgScriptpath, $wgScript and $wgArticlePath. The following is an example of what should NOT be done: Because both of the first two variables end in "/wiki" the result will be that the 'Alias /index.php /filesystem/path/to/my/site/index.php' line in httpd.conf will instead redirect ANY index.php file on your whole site to the broken looping alias stated above. Ensure that the $wgServer does not contain any of the contents of the variables mentioned above.

Known working setup based on the above, presuming that you have renamed 'wiki' to 'w' on your server: /wiki

/var/www/w/LocalSettings.php
Note: The location of the web root can vary - it might not be /var/www

httpd.conf
Alias /wiki /var/www/w/index.php Alias /index.php /var/www/w/index.php Note: Windows tends to prefer quotes around paths for aliases, even if there are no spaces. If your web root is not /var/www THIS NEEDS TO BE CHANGED
 * 1) Put these lines AT THE BOTTOM and IN THIS ORDER

Problems with MediaWiki 1.11 / "Index.php" article
If you find yourself editing a page called "Index.php", try adding this to LocalSettings.php</tt>: $wgUsePathInfo = false; Note that setting this global to false means that the semi-friendly solutions described above for handling ampersands etc will no longer work. To temporarily fix this 1.11 bug before the developers have released a fixed version, see MediaWiki 1.11 title extraction bug for details about how to revert 1.11's title handling code to the 1.10 version.