From: Wolfgang <wol...@ex...> - 2008-12-01 18:15:11
|
> My goal is to rewrite eXist REST URLs from: > historicaldocuments.xq?volume=frus1969-76v17&id=d1 > which displays document 1 (d1) from frus1969-76v17.xml to something more like: > historicaldocuments/frus1969-76v17/d1 > > I really like what I've read about Wolfgang's XQueryURLRewrite > component, since it's all XQuery-based. Is that ready to tap into? It is one of the core components of AtomicWiki and has been running stable for a while. However, I will soon commit an updated version, which adds a feature to apply one or more views (e.g. an XSLT transform) to the returned HTTP response, supports request attributes and fixes a few issues. There will be some minor changes to the XML schema as well. > I'm building from trunk. I see in WEB-INF/web.xml, XQueryURLRewrite > is "disabled by default" -- so I could enable that; and I see > webapp/redirector has two files that demo this functionality -- but I > don't understand which file to view first/second. I planned to post something on the blog once I uploaded the new version. In the meantime, you would need the following steps to implement what you described above: 1) edit web.xml and enable XQueryURLRewrite: <filter> <filter-name>XQueryURLRewrite</filter-name> <filter-class>org.exist.http.urlrewrite.XQueryURLRewrite</filter-class> <init-param> <param-name>xquery</param-name> <param-value>u/controller.xql</param-value> </init-param> </filter> <filter-mapping> <filter-name>XQueryURLRewrite</filter-name> <url-pattern>/u/*</url-pattern> </filter-mapping> assuming that we want to rewrite all URLS below /exist/u/ (you could also map the filter to /* and filter everything, but this may cause some trouble with Cocoon). 2) create a file webapp/u/controller.xql: xquery version "1.0"; let $uri := request:get-uri() let $components := text:groups($uri, "/([^/]+)/([^/]+)/([^/]+)$") return <dispatch xmlns="http://exist.sourceforge.net/NS/exist"> <forward url="/u/{$components[2]}.xql"/> <add-parameter name="volume" value="{$components[3]}"/> <add-parameter name="id" value="{$components[4]}"/> </dispatch> 3) to see if it works, I also add a test query as webapp/u/documents.xql: <html> <ul> <li>Volume: {request:get-parameter("volume", "")}</li> <li>Id: {request:get-parameter("id", "")}</li> </ul> </html> Restart eXist. Now the URL http://localhost:8080/exist/u/documents/frus1969-76v17/d1 should be handled by documents.xql. More documentation will follow soon. Also check http://code.google.com/p/atomicwiki/source/browse/trunk/AtomicWiki/webapp/dispatcher.xql Wolfgang |