Wiki source code of Short XWiki URLs

Version 41.2 by Vincent Massol on 2013/09/19

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc/}}
3 {{/box}}
4
5 This tutorial shows you how to tune your XWiki platform by replacing the default URL scheme with a shorter scheme.
6
7 {{info}}
8 A short URL is an URL without the ##xwiki/bin/view## parts.
9 {{/info}}
10
11 = I. Application name =
12
13 The ##/xwiki/## part of the URL is the application name. It identifies the application that should process the request, and it allows a container to host more than one application. To change it you must refer to your container's documentation and find how to map the context path of a web application. For example on Tomcat it's enough to simply deploy the XWiki webapp in the ##webapps## directory, in a sub directory named after the application name you wish to use (e.g. ##webapps/myappname##).
14
15 A special case is when deploying XWiki as the ROOT application, which actually allows the application name part to be empty, so an URL can take the form ##server.com/bin/view/Space/Document##. Achieving this depends on the container, as there's no standard regarding the ROOT application. For example:
16 * in Tomcat, with the default configuration, all it takes is to deploy the XWiki web application in ##webapps##, in a sub directory named ##ROOT## (i.e. ##webapps/ROOT##).
17 * In Jetty, with the default configuration, all it takes is to deploy the XWiki web application in ##webapps##, in a sub directory named ##root##. Note that if you're using the Standalone distribution (which packages Jetty and HSQLDB) then you'll also need to:
18 ** Remove the existing ##webapps/root## directory which contains a redirect Servlet that automatically redirects root URLs to the ##xwiki## context. You won't need that anymore.
19 ** Rename the existing ##webapps/xwiki## directory into ##webapps/root##.
20 ** Remove the ##jetty/contexts/xwiki.xml## file and thus keep only the ##jetty/contexts/root.xml## file. Otherwise you'll get a warning in the console.
21
22 Refer to your container's documentation for more details.
23
24 = II. Servlet mapping name =
25
26 The second part is the hardest part to remove. It identifies the servlet that should process the page, which, for ##/bin/##, is the Struts servlet. Generically speaking, to get rid of ##/bin/##, you need to configure your system so that URLs matching ##/*## are mapped to the Struts Servlet (by default only ##/bin/*## URLs are mapped to the Struts Servlet).
27
28 However you need to be careful that the following prefixes do NOT go through the Struts Servlet (see your ##web.xml## to check their current mappings):
29 * ##/resources/*## and ##/skins/*##: Statically served resources. These need to be served directly as static resources.
30 * ##/rest/*##: REST resources, served by the XWiki REST Servlet
31 * ##/xmlrpc/*##: XML-RPC resources, served by the XWiki XMLRPC Servlet
32 * ##/resources/*~*/*.gwtrpc##: GWT-RPC calls, served by the XWiki GWT Servlet
33 * ##/webdav/*##: WebDav calls, served by the XWiki WebDAV Servlet
34 * ##/XWikiService##: Another XWiki GWT Servlet
35 * ##/redirect##: The XWiki Redirect Servlet used to redirect to the home page when no page is specified in the URL
36
37 There are various alternate to achieve this:
38
39 {{toc scope="local"/}}
40
41 {{info}}
42 You might be tempted to configure just your XWiki's ##web.xml## file [[but this won't work>>ShortURLsInvalid]].
43 {{/info}}
44
45 == UrlRewriteFilter ==
46
47 {{info}}This is the simplest solution of all but you'll need XWiki 5.2+ because of [[this issue that was fixed in XWiki 5.2>>http://jira.xwiki.org/browse/XWIKI-9430]].{{/info}}
48
49 "UrlRewriteFilter" is a [[framework offering a Servlet Filter>>http://www.tuckey.org/urlrewrite/]] allowing to rewrite URLs.
50
51 Install steps:
52 1. [[Download the JAR>>http://www.tuckey.org/urlrewrite/]] and put it in ##WEB-INF/lib##
53 1. Edit your ##WEB-INF/web.xml## and add the ##<filter>## and ##filter-mapping## definitions [[as documented>>http://www.tuckey.org/urlrewrite/]]
54 1. Drop the following content in a file at ##WEB-INF/urlrewrite.xml##:(((
55 {{code language="xml"}}
56 <?xml version="1.0" encoding="utf-8"?>
57 <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
58 "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
59 <urlrewrite>
60
61 <rule>
62 <note>
63 Ensure that URLs ending with .gwtrpc are not modified.
64 </note>
65 <from>^/(.*)\.gwtrpc$</from>
66 <to type="forward" last="true">-</to>
67 </rule>
68
69 <rule>
70 <note>
71 En sure that URLs that must not be served by the Struts Servlet are not modified.
72 </note>
73 <from>^/(bin|resources|skins|rest|webdav|xmlrpc)/(.*)$</from>
74 <to type="forward" last="true">-</to>
75 </rule>
76
77 <rule>
78 <note>
79 For all other URLs we prepend the "/bin/" prefix so that they get routed to the XWiki Action Servlet.
80 </note>
81 <from>^/(.*)$</from>
82 <to type="forward">/bin/$1</to>
83 </rule>
84
85 <outbound-rule>
86 <note>
87 Rewrite outbound URLs to remove the "/bin" part.
88 </note>
89 <from>/bin/(.*)/(.*)$</from>
90 <to>/$1/$2</to>
91 </outbound-rule>
92
93 </urlrewrite>
94 {{/code}}
95 )))
96
97 == Apache ==
98
99 Strategy:
100 * Tell Apache that ##/skins## and ##/resources## URLs (except for ##/resources/*~*/*.gwtrpc## ones) are served statically so that they don't go through the Servlet container
101 * Configure ##web.xml## so that ##/*## URLs go through the Struts Servlet and so that ##/resources/*~*/*.gwtrpc## URLs go through the GWT Servlet
102 * Tell XWiki to not generate URLs with ##bin## in the path
103
104 Configuration steps:
105 * Setup the following Apache configuration:(((
106 {{code language="apache"}}
107 Alias /skins /usr/local/xwiki/skins
108 Alias /resources /usr/local/xwiki/resources
109
110 RewriteEngine on
111
112 RewriteRule ^/+skins - [L]
113 RewriteCond %{REQUEST_URI} !\.gwtrpc$
114 RewriteRule ^/+resources($|/.*) - [L]
115
116 RewriteRule .* http://localhost:8080%{REQUEST_URI} [P,L]
117 ProxyPassReverse / http://localhost:8080/
118 {{/code}}
119 )))
120 * Edit ##web.xml## and add:(((
121 {{code language="xml"}}
122 <servlet-mapping>
123 <servlet-name>action</servlet-name>
124 <url-pattern>/*</url-pattern>
125 </servlet-mapping>
126 {{/code}}
127 )))
128 * Edit ##web.xml## and replace the existing mapping:(((
129 {{code language="xml"}}
130 <servlet-mapping>
131 <servlet-name>gwtrpc</servlet-name>
132 <url-pattern>*.gwtrpc</url-pattern>
133 </servlet-mapping>
134 {{/code}}
135
136 by
137
138 {{code language="xml"}}
139 <servlet-mapping>
140 <servlet-name>gwtrpc</servlet-name>
141 <url-pattern>/resources/*</url-pattern>
142 </servlet-mapping>
143 {{/code}}
144 )))
145 * Add the following in ##xwiki.cfg## (empty value after the equal sign):(((
146 {{code language="none"}}
147 xwiki.defaultservletpath=
148 {{/code}}
149 )))
150 * {{info}}Only for XWiki 5.2+{{/info}} Add the following in ##xwiki.properties## (empty value after the equal sign):(((
151 {{code language="none"}}
152 url.standard.entityPathPrefix=
153 {{/code}}
154 )))
155
156 {{warning}}
157 There's a regression in XWiki 5.1 that will prevent this to work correctly. To overcome it, we recommend that you upgrade to XWiki 5.2. If you cannot, you could do the following:
158 * Remove the 3 ##xwiki-platform-url-*## JARs you have in your ##WEB-INF/lib## directory and instead add the following:
159 ** http://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-url-api/5.2-milestone-2/xwiki-platform-url-api-5.2-milestone-2.jar
160 ** http://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-url-container/5.2-milestone-2/xwiki-platform-url-container-5.2-milestone-2.jar
161 ** http://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-url-standard/5.2-milestone-2/xwiki-platform-url-standard-5.2-milestone-2.jar
162 * Edit your ##xwiki.properties## file and add (no value after the equal sign):(((
163 {{code}}
164 url.standard.entityPathPrefix=
165 {{/code}}
166 )))
167 {{/warning}}
168
169 == Others ==
170
171 Some XWiki users have contributed other solutions but they've not been verified by a XWiki Development Team member at this stage so use at your own risk ;)
172
173 * [[Lighttpd + Jetty>>ShortURLsLighttpdJetty]]
174
175 = III. Struts action name =
176
177 The third part, ##/view/##, identifies the struts action that should process a request. So this tells what we want to do with the document, ##/view/## it, ##/edit/## it or ##/delete/## it, for example. The XWiki platform allows this part to be missing, considering that the default action is to just display the document, so an URL like ##server.com/bin/Space/Document## will work out of the box.
178
179 Even more, the URL factory, the component that generates URLs, can be configured to skip this part when the action is ##/view/##. To do this write this code in ##xwiki.cfg##: {{code language="none"}}xwiki.showviewaction=0{{/code}}.
180
181 = IV. Error Page =
182
183 At the ##WEB-INF/web.xml##, the ##location## of the 404 error code needs to be changed accordingly. For example:
184
185 {{code language="xml"}}
186 <error-page>
187 <error-code>404</error-code>
188 <!--<location>/xwiki/bin/view/Main/DocumentDoesNotExist</location>-->
189 <location>/bin/Main/DocumentDoesNotExist</location>
190 </error-page>
191 {{/code}}
192
193 = V. Conclusion =
194
195 After performing all these changes, you should be able to access documents with URLs like:
196
197 * server.com/Space/Document
198 * server.com/Space/ (pointing to Space.WebHome)
199 * server.com/Document (pointing to Main.Document)
200 * server.com/ will show Main.WebHome, without any redirect.
201
202 As a bonus, these changes are backwards compatible, meaning that any currently working URL will also work with these changes performed, so you won't have any broken bookmarks.

Get Connected