Wiki source code of Short XWiki URLs

Version 47.2 by Vincent Massol on 2015/03/13

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 == Deploying as ROOT ==
16
17 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##.
18
19 Achieving this depends on the container, as there's no standard regarding the ROOT application (Refer to your container's documentation for more details).
20
21 Some examples:
22 * 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##).
23 * 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:
24 ** 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.
25 ** Rename the existing ##webapps/xwiki## directory into ##webapps/root##.
26 ** 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.
27
28 In addition, starting with XWiki 6.2.8/6.4.3/7.0 you must tell XWiki that it's deployed as ROOT by setting the ##xwiki.webapppath## to empty in your ##xwiki.cfg## configuration file as in:
29
30 {{code language="none"}}
31 xwiki.webapppath=
32 {{/code}}
33
34 The reason is that XWiki cannot guess the webapp context from the URL in this case. This seemed to work on previous versions but it was actually leading to errors from time to time, depending on what URL was used when doing the first request on the XWiki instance.
35
36 = II. Servlet mapping name =
37
38 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).
39
40 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):
41
42 * ##/resources/*## and ##/skins/*##: Statically served resources. These need to be served directly as static resources.
43 * ##/rest/*##: REST resources, served by the XWiki REST Servlet
44 * ##/xmlrpc/*##: XML-RPC resources, served by the XWiki XMLRPC Servlet
45 * ##/resources/~*~*/*.gwtrpc##: GWT-RPC calls, served by the XWiki GWT Servlet
46 * ##/webdav/*##: WebDav calls, served by the XWiki WebDAV Servlet
47 * ##/XWikiService##: Another XWiki GWT Servlet
48 * ##/redirect##: The XWiki Redirect Servlet used to redirect to the home page when no page is specified in the URL
49
50 There are various alternate to achieve this:
51
52 {{toc scope="local"/}}
53
54 {{info}}
55 You might be tempted to configure just your XWiki's ##web.xml## file [[but this won't work>>ShortURLsInvalid]].
56 {{/info}}
57
58 == UrlRewriteFilter ==
59
60 {{info}}
61 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]].
62 {{/info}}
63
64 "UrlRewriteFilter" is a [[framework offering a Servlet Filter>>http://www.tuckey.org/urlrewrite/]] allowing to rewrite URLs.
65
66 Install steps:
67
68 1. [[Download the JAR>>http://www.tuckey.org/urlrewrite/]] and put it in ##WEB-INF/lib##
69 1. Edit your ##WEB-INF/web.xml## and add the ##<filter>## and ##filter-mapping## definitions [[as documented>>http://www.tuckey.org/urlrewrite/]]
70 1. Drop the following content in a file at ##WEB-INF/urlrewrite.xml##:(((
71 {{code language="xml"}}
72 <?xml version="1.0" encoding="utf-8"?>
73 <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
74 "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
75 <urlrewrite decode-using="null">
76
77 <rule>
78 <note>
79 Ensure that URLs ending with .gwtrpc are not modified.
80 </note>
81 <from>^/(.*)\.gwtrpc$</from>
82 <to type="forward" last="true">-</to>
83 </rule>
84
85 <rule>
86 <note>
87 En sure that URLs that must not be served by the Struts Servlet are not modified.
88 </note>
89 <from>^/(bin|resources|skins|rest|webdav|xmlrpc|wiki)/(.*)$</from>
90 <to type="forward" last="true">-</to>
91 </rule>
92
93 <rule>
94 <note>
95 For all other URLs we prepend the "/bin/" prefix so that they get routed to the XWiki Action Servlet.
96 </note>
97 <from>^/(.*)$</from>
98 <to type="forward">/bin/$1</to>
99 </rule>
100
101 <outbound-rule>
102 <note>
103 Rewrite outbound URLs to remove the "/bin" part.
104 </note>
105 <from>/bin/(.*)/(.*)$</from>
106 <to>/$1/$2</to>
107 </outbound-rule>
108
109 </urlrewrite>
110 {{/code}}
111 )))
112
113 **Note**: for debugging of URL Rewrite filter, set the ##logLevel## parameter as described in http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#filterparams (using the value ##sysout:DEBUG##, the logs can be read in tomcat logs).
114
115 == Apache ==
116
117 Strategy:
118
119 * 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
120 * Configure ##web.xml## so that ##/*## URLs go through the Struts Servlet and so that ##/resources/~*~*/*.gwtrpc## URLs go through the GWT Servlet
121 * Tell XWiki to not generate URLs with ##bin## in the path
122
123 Configuration steps:
124
125 * Setup the following Apache configuration:(((
126 {{code language="apache"}}
127 Alias /skins /usr/local/xwiki/skins
128 Alias /resources /usr/local/xwiki/resources
129
130 RewriteEngine on
131
132 RewriteRule ^/+skins - [L]
133 RewriteCond %{REQUEST_URI} !\.gwtrpc$
134 RewriteRule ^/+resources($|/.*) - [L]
135
136 RewriteRule .* http://localhost:8080%{REQUEST_URI} [P,L]
137 ProxyPassReverse / http://localhost:8080/
138 {{/code}}
139 )))
140 * Edit ##web.xml## and add:(((
141 {{code language="xml"}}
142 <servlet-mapping>
143 <servlet-name>action</servlet-name>
144 <url-pattern>/*</url-pattern>
145 </servlet-mapping>
146 {{/code}}
147 )))
148 * Edit ##web.xml## and replace the existing mapping:(((
149 {{code language="xml"}}
150 <servlet-mapping>
151 <servlet-name>gwtrpc</servlet-name>
152 <url-pattern>*.gwtrpc</url-pattern>
153 </servlet-mapping>
154 {{/code}}
155
156 by
157
158 {{code language="xml"}}
159 <servlet-mapping>
160 <servlet-name>gwtrpc</servlet-name>
161 <url-pattern>/resources/*</url-pattern>
162 </servlet-mapping>
163 {{/code}}
164 )))
165 * Add the following in ##xwiki.cfg## (empty value after the equal sign):(((
166 {{code language="none"}}
167 xwiki.defaultservletpath=
168 {{/code}}
169 )))
170 * {{info}}Only for XWiki 5.2+{{/info}} Add the following in ##xwiki.properties## (empty value after the equal sign):(((
171 {{code language="none"}}
172 url.standard.getEntityPathPrefix=
173 {{/code}}
174 )))
175
176 {{warning}}
177 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:
178 * Remove the 3 ##xwiki-platform-url-*## JARs you have in your ##WEB-INF/lib## directory and instead add the following:
179 ** 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
180 ** 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
181 ** 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
182 * Edit your ##xwiki.properties## file and add (no value after the equal sign):(((
183 {{code}}
184 url.standard.entityPathPrefix=
185 {{/code}}
186 )))
187 {{/warning}}
188
189 == Others ==
190
191 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 ;)
192
193 * [[Lighttpd + Jetty>>ShortURLsLighttpdJetty]]
194
195 = III. Struts action name =
196
197 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.
198
199 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}}.
200
201 = IV. Error Page =
202
203 At the ##WEB-INF/web.xml##, the ##location## of the 404 error code needs to be changed accordingly. For example:
204
205 {{code language="xml"}}
206 <error-page>
207 <error-code>404</error-code>
208 <!--<location>/xwiki/bin/view/Main/DocumentDoesNotExist</location>-->
209 <location>/bin/Main/DocumentDoesNotExist</location>
210 </error-page>
211 {{/code}}
212
213 = V. Conclusion =
214
215 After performing all these changes, you should be able to access documents with URLs like:
216
217 * server.com/Space/Document
218 * server.com/Space/ (pointing to Space.WebHome)
219 * server.com/Document (pointing to Main.Document)
220 * server.com/ will show Main.WebHome, without any redirect.
221
222 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