Wiki source code of Short XWiki URLs

Version 45.1 by Anca Luca on 2014/12/10

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