System Administrator's Guide/Clean URL Configuration: Difference between revisions
From Mahara Wiki
< System Administrator's Guide
(10 intermediate revisions by 6 users not shown) | |||
Line 39: | Line 39: | ||
<IfModule mod_rewrite.c> | <IfModule mod_rewrite.c> | ||
RewriteEngine on | RewriteEngine on | ||
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1 | RewriteRule ^<path of wwwroot>/user/([a-z0-9-]+)/?$ <path of wwwroot>/user/view.php?profile=$1&%{QUERY_STRING} | ||
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2 | RewriteRule ^<path of wwwroot>/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?profile=$1&page=$2&%{QUERY_STRING} | ||
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1 | RewriteRule ^<path of wwwroot>/group/([a-z0-9-]+)/?$ <path of wwwroot>/group/view.php?homepage=$1&%{QUERY_STRING} | ||
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2 | RewriteRule ^<path of wwwroot>/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?homepage=$1&page=$2&%{QUERY_STRING} | ||
</IfModule> | </IfModule> | ||
Note: <path of wwwroot> is the path of your $cfg->wwwroot defined in the config.php | |||
* Alternatively, if you are on commercial hosting and do not have access to this file, your host might also allow apache directives to be specified in an '''htaccess file''', so try adding the following lines above into a file named '.htaccess' in your web root folder: | * Alternatively, if you are on commercial hosting and do not have access to this file, your host might also allow apache directives to be specified in an '''htaccess file''', so try adding the following lines above into a file named '.htaccess' in your web root folder: | ||
<IfModule mod_rewrite.c> | <IfModule mod_rewrite.c> | ||
RewriteEngine on | RewriteEngine on | ||
RewriteRule ^user/([a-z0-9-]+)/?$ /user/view.php?profile=$1 | RewriteRule ^user/([a-z0-9-]+)/?$ <path of wwwroot>/user/view.php?profile=$1&%{QUERY_STRING} | ||
RewriteRule ^user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2 | RewriteRule ^user/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?profile=$1&page=$2&%{QUERY_STRING} | ||
RewriteRule ^group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1 | RewriteRule ^group/([a-z0-9-]+)/?$ <path of wwwroot>/group/view.php?homepage=$1&%{QUERY_STRING} | ||
RewriteRule ^group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2 | RewriteRule ^group/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?homepage=$1&page=$2&%{QUERY_STRING} | ||
</IfModule> | </IfModule> | ||
* Restart apache | * Restart apache | ||
Line 56: | Line 58: | ||
** If the rewrite is working correctly, you will see an error message with your Mahara site header saying "The page you are looking for could not be found ... User admin not found" | ** If the rewrite is working correctly, you will see an error message with your Mahara site header saying "The page you are looking for could not be found ... User admin not found" | ||
** If the rewrite is '''not''' working correctly, you will most likely see a generic error from your webserver, with a message like "The requested URL /user/admin was not found on this server" | ** If the rewrite is '''not''' working correctly, you will most likely see a generic error from your webserver, with a message like "The requested URL /user/admin was not found on this server" | ||
=== Instructions for Nginx === | |||
* Add the following rewrite rules to the server { } block | |||
rewrite ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&$query_string; | |||
rewrite ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&$query_string; | |||
rewrite ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&$query_string; | |||
rewrite ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&$query_string; | |||
* Restart nginx | |||
= Enable the Clean URLs option in Mahara = | = Enable the Clean URLs option in Mahara = | ||
Line 87: | Line 100: | ||
= Advanced Configuration (experimental and slightly dangerous) = | = Advanced Configuration (experimental and slightly dangerous) = | ||
You may change the default '''user''' and '''group''' strings given in the above examples with the additional $cfg->cleanurluserdefault and $cfg->cleanurlgroupdefault settings in config.php. For example, if you want to change 'user' to 'profile', so that the clean URLs are of the form <nowiki>http://mahara.example.com/profile/bob</nowiki>, you would add "$cfg->cleanurluserdefault = 'profile';" in config.php, and change the first two rewrite rules above to use 'profile' in place of 'user'. | * You may change the default '''user''' and '''group''' strings given in the above examples with the additional $cfg->cleanurluserdefault and $cfg->cleanurlgroupdefault settings in config.php. For example, if you want to change 'user' to 'profile', so that the clean URLs are of the form <nowiki>http://mahara.example.com/profile/bob</nowiki>, you would add "$cfg->cleanurluserdefault = 'profile';" in config.php, and change the first two rewrite rules above to use 'profile' in place of 'user'. | ||
* You can also change the list of allowed characters by editing regular expressions in your config.php file. See the file htdocs/lib/config-defaults.php of your Mahara installation for more information. | |||
<div style="border: 1px dotted #ff8888; margin: 10px 0; padding: 10px; background-color: #f8f8f8;"><span style="color: red;">'''Note:'''</span> If you change either of the above options, you '''must''' make sure that your rewrite rules are changed appropriately, and also take care to ensure that your rewrite rules will never match any of Mahara's pages -- this may make them inaccessible. For example, if you want allow the character '.' in your user urls, and you leave the cleanurluserdefault string as 'user', a URL such as <nowiki>http://mahara.example.com/user/view.php</nowiki> will be matched by your rewrite rule and converted to <nowiki>http://mahara.example.com/user/view.php?profile=view.php</nowiki>, which is probably not what you want.</div> | |||
If you | * If you wish to stop your users from editing their own profile urls, set $cfg->cleanurlusereditable = false; in config.php. | ||
= User subdomain option | = User subdomain option = | ||
This option generates subdomain-style profile urls like <nowiki>http://bob.mahara.example.com</nowiki> | This option generates subdomain-style profile urls like <nowiki>http://bob.mahara.example.com</nowiki> | ||
'''<span style="color: red;">Warning:</span>''' Enabling this option on your site is likely to cause users with open sessions to be logged out on all profile pages. To avoid this, expire all sessions by closing the site in the admin area and reopening it, '''before''' enabling this option. | <div style="border: 1px dotted #ff8888; margin: 10px 0; padding: 10px; background-color: #f8f8f8;">'''<span style="color: red;">Warning:</span>''' Enabling this option on your site is likely to cause users with open sessions to be logged out on all profile pages. To avoid this, expire all sessions by closing the site in the admin area and reopening it, '''before''' enabling this option.</div> | ||
== Webserver configuration == | == Webserver configuration == | ||
Line 128: | Line 143: | ||
* Log in | * Log in | ||
* Check that you have set your profile url on the settings page | * Check that you have set your profile url on the settings page | ||
* Click on your name in the top right. You should be taken to your profile page, and browser should be showing a subdomain url like <nowiki>http://admin.mahara.example.com</nowiki> in the location bar. | * Click on your name in the top right. You should be taken to your profile page, and the browser should be showing a subdomain url like <nowiki>http://admin.mahara.example.com</nowiki> in the location bar. |
Latest revision as of 16:29, 22 October 2015
From Mahara 1.6, you can configure your site to use human-readable URLs for user profiles, group homepages and portfolio pages. For example,
- http://mahara.example.com/user/bob
- http://mahara.example.com/user/bob/bobs-portfolio-page
- http://mahara.example.com/group/bobs-group
- http://mahara.example.com/group/bobs-group/an-interesting-group-page
The strings identifying the user, group and page are all editable within Mahara.
There are two steps to this - you must configure your webserver to rewrite URLs of incoming requests. Once you've done that, you can then configure your Mahara site to generate clean URLs internally, and let your users pick their URLs.
Configure your webserver
By default, profile pages, group homepages, and portfolio pages are accessible at URLs like
- http://mahara.example.com/user/view.php?id=123
- http://mahara.example.com/group/view.php?id=456
- http://mahara.example.com/view/view.php?id=789
In Mahara 1.6, users, groups and portfolio pages also have a readable "url id" which is chosen by the user. Profile pages are also accessible at
- http://mahara.example.com/user/view.php?profile=bob
Group homepages are also accessible at
- http://mahara.example.com/group/view.php?homepage=bobs-group
Portfolio pages owned by users and groups are accessible at
- http://mahara.example.com/view/view.php?profile=bob&page=bobs-portfolio-page
- http://mahara.example.com/view/view.php?homepage=bobs-group&page=an-interesting-group-page
Your webserver needs to convert urls such as http://mahara.example.com/user/bob to http://mahara.example.com/user/view.php?profile=bob, etc.
Instructions for Apache2
- Enable the rewrite module (in Debian/Ubuntu: "a2enmod rewrite")
- Edit the Apache configuration file for your site. You may need to create this file, or you may have already set one up during installation. Add the following lines before the closing </VirtualHost> tag:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^<path of wwwroot>/user/([a-z0-9-]+)/?$ <path of wwwroot>/user/view.php?profile=$1&%{QUERY_STRING} RewriteRule ^<path of wwwroot>/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?profile=$1&page=$2&%{QUERY_STRING} RewriteRule ^<path of wwwroot>/group/([a-z0-9-]+)/?$ <path of wwwroot>/group/view.php?homepage=$1&%{QUERY_STRING} RewriteRule ^<path of wwwroot>/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?homepage=$1&page=$2&%{QUERY_STRING} </IfModule>
Note: <path of wwwroot> is the path of your $cfg->wwwroot defined in the config.php
- Alternatively, if you are on commercial hosting and do not have access to this file, your host might also allow apache directives to be specified in an htaccess file, so try adding the following lines above into a file named '.htaccess' in your web root folder:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^user/([a-z0-9-]+)/?$ <path of wwwroot>/user/view.php?profile=$1&%{QUERY_STRING} RewriteRule ^user/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?profile=$1&page=$2&%{QUERY_STRING} RewriteRule ^group/([a-z0-9-]+)/?$ <path of wwwroot>/group/view.php?homepage=$1&%{QUERY_STRING} RewriteRule ^group/([a-z0-9-]+)/([a-z0-9-]+)/?$ <path of wwwroot>/view/view.php?homepage=$1&page=$2&%{QUERY_STRING} </IfModule>
- Restart apache
- Verify that the rewrite is working. Browse to a URL on your site such as <wwwroot>user/admin
- If the rewrite is working correctly, you will see an error message with your Mahara site header saying "The page you are looking for could not be found ... User admin not found"
- If the rewrite is not working correctly, you will most likely see a generic error from your webserver, with a message like "The requested URL /user/admin was not found on this server"
Instructions for Nginx
- Add the following rewrite rules to the server { } block
rewrite ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&$query_string; rewrite ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&$query_string; rewrite ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&$query_string; rewrite ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&$query_string;
- Restart nginx
Enable the Clean URLs option in Mahara
In the config.php file for your Mahara site, add the following line:
$cfg->cleanurls = true;
Once this is enabled, any new users, groups and pages will have clean URLs generated automatically, but they can also be edited on the site.
- User URL fragments are 3-30 characters long, and can be edited on the Settings page (account/index.php)
- Group URL fragments are 3-30 characters long, and are edited on the edit group page (group/edit.php)
- Portfolio page URL fragments owned by users and groups are 3-100 characters, and can be edited under "Edit title & description" in the page editor (view/edit.php)
All these fields may contain only lowercase letters from a-z, digits, and hyphens.
Upgrade all users, groups and pages to use Clean URLs (optional)
In the admin area, under Site Administration -> Extensions -> Clean URLs, there is a button that will regenerate all clean URLs. This is useful when you want to initialise URLs throughout your site.
- User URLs will be generated based on usernames
- Group URLs are based on the group name
- Portfolio page URLs are based on the page title
Duplicates are avoided by appending a hyphen followed by digits, e.g.
- http://mahara.example.com/user/bob/bobs-portfolio-page
- http://mahara.example.com/user/bob/bobs-portfolio-page-1, etc.
If you enable clean URLs, but you don't perform this step, the site will still work fine. Existing pages will still be accessed using ids.
Advanced Configuration (experimental and slightly dangerous)
- You may change the default user and group strings given in the above examples with the additional $cfg->cleanurluserdefault and $cfg->cleanurlgroupdefault settings in config.php. For example, if you want to change 'user' to 'profile', so that the clean URLs are of the form http://mahara.example.com/profile/bob, you would add "$cfg->cleanurluserdefault = 'profile';" in config.php, and change the first two rewrite rules above to use 'profile' in place of 'user'.
- You can also change the list of allowed characters by editing regular expressions in your config.php file. See the file htdocs/lib/config-defaults.php of your Mahara installation for more information.
- If you wish to stop your users from editing their own profile urls, set $cfg->cleanurlusereditable = false; in config.php.
User subdomain option
This option generates subdomain-style profile urls like http://bob.mahara.example.com
Webserver configuration
Subdomain rewrite rules for Apache 2
- In your VirtualHost configuration, find the ServerName directive, add a wildcard ServerAlias line after it. If your ServerName is mahara.example.com, add
ServerAlias *.mahara.example.com
- Add the following additional rewrite rules, after the general rewrite rules above, but still inside the <IfModule mod_rewrite.c> block
RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.mahara\.com$ RewriteRule ^/([a-z0-9-]+)/?$ /view/view.php?profile=%1&page=$1 [QSA] RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.mahara\.com$ RewriteRule ^/?$ /user/view.php?profile=%1 [QSA]
- Replace \.example\.mahara\.com in the above rules with your wwwroot.
- Restart apache
Enable the user subdomain option in config.php
$cfg->cleanurlusersubdomains = true;
Now test it:
- Clear your site's cookies from your browser
- Log in
- Check that you have set your profile url on the settings page
- Click on your name in the top right. You should be taken to your profile page, and the browser should be showing a subdomain url like http://admin.mahara.example.com in the location bar.