Manual:Short URL/Apache
Parts of this page (those related to Apache2 configuration instructions) are outdated. |
![](http://upload.wikimedia.org/wikipedia/mediawiki/8/83/ENWP-ShortURL.png)
These instructions help setup Short URLs on Apache. The LiteSpeed webserver is Apache compatible and can be configured in relatively the same way. For information on what Short URLs are or to get instructions on configuration for other servers see Manual:Short URL . If you don't know what webserver you're using since you're using some sort of web hosting service, it's very likely that your host is using Apache.
Setup
editBefore starting, you need to decide on the name of your virtual "short url" path.
In this manual we'll recommend/assume the following. Remember to use your own paths if they are different.
- The MediaWiki directory is located at:
/w
- The desired short url format is:
/wiki/Page_title
Server config
editFind the right file
editThe recommended way to set up short URLs in Apache is by editing the Apache config files.
This requires that you have access to the server configuration.
If you are on a shared host, you most likely don't and will need to use a .htaccess
file instead.
Using .htaccess
files is less efficient and doesn't give you as much control when it comes to fancy setups with multiple domains but they are powerful enough to set up most short url configurations.
LiteSpeed users should use the .htaccess
method.
Use the instructions in one of the following two sections, depending on whether you have root access or need to use .htaccess
instead.
Find the Apache configuration file (root access)
editThe correct configuration file to edit for root configurations may be in one of a number of places.
The correct config file to edit is the one in /etc/apache2/sites-available/
where the configuration for your wiki has been setup.
Most linux distributions setup Apache with set of sites-available/
and sites-enabled/
folders setup.
If you haven't set one up and are using the default /var/www
for your wiki setup then you can edit /etc/apache2/sites-available/default
.
Don't forget to enable overrides by AllowOverride All
in /etc/apache2/apache2.conf
.
It is disabled by default in Ubuntu 12.04 and Ubuntu 12.10.
If your distribution does not have those directories, then you should edit the Apache configuration file directly.
This file should be at /etc/apache2/apache2.conf
.
Note that it used to be named httpd.conf
, if you have a httpd.conf
and no apache2.conf
then httpd.conf
is the one you want to edit.
If your Apache config isn't in any of these spots you should consult the documentation for whatever system you used to install Apache, and find the location of the Apache configuration file.
If you're on a shared host without access to Apache config files you'll have to use a .htaccess file instead.
In an Apache config file you will likely have a VirtualHost block containing your wiki. If you do have one then that is the location where your rewrite rules will go. RewriteRule config does not inherit so don't put these config options in the global config if you are using a VirtualHost.
After you've setup the config as above inside Apache you're going to need to restart Apache to make it apply the new config.
- If you are using Plesk or cPanel it should have a method of restarting the server.
- From the command line the command is usually something like
apache2ctl graceful
,apachectl graceful
,/etc/init.d/apache2 restart
or as on the latest Fedora releasessystemctl reload httpd.service
. These commands need to be run as root, usually by prefixing them withsudo ...
.
Where to put .htaccess
editAllowOverride
controls whether .htaccess files are allowed to control server configuration. If these rewrite rules do nothing at all you may have to modify the AllowOverride
setting in the Apache config to include FileInfo
. It also requires Options FollowSymLinks
for the directory.If you're using a .htaccess
file you'll need to edit or create the file. Find the path that contains both your script path and your virtual path. Usually this means the top directory of your site, but let's look at a few examples:
wgScript | Example | wgArticlePath | Example | .htaccess location |
---|---|---|---|---|
/w/index.php | https://www.mediawiki.org/w/index.php?... | /wiki/Page_title | https://www.mediawiki.org/wiki/Manual:Short_URL | /.htaccess |
/w/index.php | https://www.mediawiki.org/w/index.php?... | /Page_title | https://www.mediawiki.org/Manual:Short_URL | /.htaccess |
/mediawiki/index.php | https://www.mediawiki.org/mediawiki/index.php?... | /view/Article | https://www.mediawiki.org/view/Manual:Short_URL | /.htaccess |
/mysite/mw/index.php | https://www.mediawiki.org/mysite/mw/index.php?... | /mysite/view/Page_title | https://www.mediawiki.org/mysite/view/Manual:Short_URL | /mysite/.htaccess |
Note that if you want to make a redirect from the main domain to your wiki's Main Page (e.g. http://example.org/ → http://example.org/wiki/Main_Page). Then you always have to set up the .htaccess file in the top level, even if the other directories are nested deeper.
Setting up the rewrite rules
editIt's easier to understand the rest of this section after a glimpse at the Apache syntax, but this synopsis is not a substitute for the full Apache documentation:
RewriteCond TestString CondPattern
RewriteRule Pattern Substitution [flags]
The RewriteCond
directive defines a condition that must be true before a RewriteRule that follows it may be applied.
One or more RewriteCond directives may precede a RewriteRule directive, and all the RewriteCond directives that precede a RewriteRule must be true before that rule may be applied to a URI.
In the examples that follow, TestString
takes the form of a reference to server variables, e.g. %{ NAME_OF_VARIABLE }
.
Although many CondPatterns
exist, the examples that follow use -f
(true when TestString is a regular file) and -d
(true when TestString is a directory), and they are preceded by a negation symbol, !
.
The RewriteRule
directive may be invoked in both the httpd.conf
file and in any .htaccess
file, but when the rewrite rule appears in .htaccess files, the implicit per-directory context affects the rule's Pattern
because rules are relative to the current directory. In .htaccess
files, Patterns are not relative to the complete, original URI. For .htaccess
files, Patterns should never start with a forward slash, /
, because the URI sub-string will never begin with a /
. The examples that follow use the L
flag whose meaning is Stop the rewriting process immediately, and don't apply any more rules.
mod_rewrite
module must be enabled in Apache or LiteSpeed servers for the examples that follow.The first rule you'll need inside of your config is one to enable the rewrite engine:
RewriteEngine On
Now we need a rule to make your article path a virtual path pointing to index.php. Be sure to replace /wiki
and /w/index.php
with the paths you chose in the beginning (if different).
RewriteRule ^/?wiki(/.*)?$ %{DOCUMENT_ROOT}/w/index.php [L]
?title=$1
or something like it in the rewrite. Including a query will cause MediaWiki's built in handling to be overridden and will create bugs on your wiki due to the fact that Apache's query rewrites are broken.[1] The goal here is to alias paths to /index.php and then let MediaWiki itself take care of parsing and routing the url, based on the configuration in LocalSettings.php.If you are using a root url instead of a normal short url you will need to use the following instead (to ensure that existing files and directories are not seen as article, e.g. "/index.php
" "/images
" etc.):
RewriteCond %{REQUEST_URI} !^/w/rest\.php
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/w/index.php [L]
/mywiki/index.php
and /mywiki/Article
you will also need to use the same two RewriteCond lines on your RewriteRule. However please note that there is no real valid reason to configure your wiki this way. If your article path is already a subdirectory you should just move your wiki's script path to another directory. Such as /w/index.php
and /mywiki/Article
or /my/index.php
and /mywiki/Article
.Sometimes, the above example doesn't work. The following (you can't set this in a .htaccess
, you need root access for this!) might work instead:
Alias /wiki /path/to/your/webroot/w/index.php
Optionally, you can include a rule to show the Main Page on the path itself, to simplify navigation when people visit urls without a page title specified:
# Redirect / to Main Page
RewriteRule ^/*$ %{DOCUMENT_ROOT}/w/index.php [L]
The end result should look something like this:
## https://www.mediawiki.org/wiki/Manual:Short_URL/Apache
# Enable the rewrite engine
RewriteEngine On
# Short URL for wiki pages
RewriteRule ^/?wiki(/.*)?$ %{DOCUMENT_ROOT}/w/index.php [L]
# Redirect / to Main Page
RewriteRule ^/*$ %{DOCUMENT_ROOT}/w/index.php [L]
or, if you used the way with the "Alias" statement:
## https://www.mediawiki.org/wiki/Manual:Short_URL/Apache
Alias /wiki /path/to/your/webroot/w/index.php
# Enable the rewrite engine
RewriteEngine On
# Redirect / to Main Page
RewriteRule ^/*$ %{DOCUMENT_ROOT}/w/index.php [L]
^/?
in the config is important because different Apache setups use different regexps. Some want you to use ^wiki/
and some want you to use ^/wiki/
. The ?
in /?
allows this rule to work in both contexts.%{DOCUMENT_ROOT}
in the config ensures that Apache has the correct non-ambiguous path. However it does not work on some badly configured free hosts. If you have 404 or 403 issues with your RewriteRules, remove the %{DOCUMENT_ROOT}
parts and try again.RewriteEngine
:Options +FollowSymLinks
[L]
to [PT,L]
) to Pass Through the request to the next handler - mod_alias, which will correctly redirect the request, as per Stack OverflowLocalSettings.php
editWe need to make the following configurations in LocalSettings.php:
## https://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath = "/w"; // this should already have been configured this way
$wgArticlePath = "/wiki/$1";
If you get an "Internal error" page saying "Redirect loop detected!" after you finish configuration you may be using something other than mod_php
. If so you need to explicitly turn on short urls using the following line in your "LocalSettings.php" file:
$wgUsePathInfo = true;
If there is still an "internal error" check the log files of your server. Maybe you have to turn on mod_rewrite
module.
Simple instructions
editThe following is a summary of what to do if you are not doing anything different than what MediaWiki recommends. If you want to do something else, you need to read all of the details above.
- https://example.com/wiki/Main_Page (url location)
- /home/me/public_html/mediawiki/w/index.html (index.html location)
- /home/me/public_html/mediawiki/.htaccess (.htaccess location)
Notice that the .htaccess file is NOT located in the "w" directory, but it is located in the directory above it.
.htaccess source code
editRewriteEngine On
# main rewrite rule
RewriteRule ^/?wiki(/.*)?$ %{DOCUMENT_ROOT}/w/index.php [L]
# Redirect / to Main Page
RewriteRule ^/*$ %{DOCUMENT_ROOT}/w/index.php [L]
LocalSettings.php source code
edit$wgScriptPath = "/w";
$wgArticlePath = "/wiki/$1";
Online Wizard
editIt is possible that this wizard will help people generate the short URLs they need. (NOTE: This needs to be tested, or the section removed.)
An automated wizard (requires MediaWiki 1.17 or later) might help:
If you just want your wiki configured quickly or you find the guide confusing then you may want to try that tool first.
If you do this, please note that you will need to edit or create a .htaccess file.
If you create it anew, please read on to further in this article about where to place the .htaccess file, and please note that this file will likely be in a different folder than the other file that will need to be edited (LocalSettings.php), which is in the installation folder (/w if you have followed the MediaWiki recommendations).
Please also note that using this wizard will not work on firewalled or private wikis.
In this case, you can still try it out by making your wiki temporarily public by setting $wgGroupPermissions['*']['read']
to true
.
Remember to change it back to false
once you are done.