From: Joe W. <jo...@gm...> - 2008-12-02 06:25:23
|
Hi Wolfgang, Thanks so much. I got your 'u' example working. I really like how this lets me control rewriting entirely with XQuery once I have the pointer to u/* set up in web.xml. This will keep me busy for some time setting up these configurations, and should be more than enough to get me started. By the way, my next tasks will be: 1. Getting the URL rewriting definitions as stored in 'webapp/u/controller.xql' to be entirely in the database (/db/u/controller.xql') rather than on the file system. 2. Completely getting rid of the '/exist/rest/db/' from my outer-facing URLs. (I'm shooting for a pure-Jetty/eXist solution, with no Cocoon or Apache involved.) If anyone's tried this, please let me know; but otherwise I'll report back on my findings. - Joe p.s. José Maria wrote to me off list with an excellent suggestion for attacking URL Rewriting with request:redirect-to(), which I've pasted in below with his permission: ---------- Forwarded message ---------- From: José María Fernández González <jmf...@cn...> Date: Mon, Dec 1, 2008 at 10:50 AM Subject: Re: [Exist-open] URL Rewriting - via Jetty's Rewrite Handler or XQueryURLRewrite? To: Joe Wicentowski <jo...@gm...> Hi Joe, yes, although it's a bit tricky it can be done even without request:redirect-to(). First of all, you have to rename your "page.xq" to "page", keeping its MIME type as application/xquery. Then, you have to use request:get-path-info() inside "page", so you can get the extra path information. For instance, if the call is: page/1/2/3 you are getting with request:get-path-info() the string "/1/2/3" in "page", so you only have to parse that string. Hope this helps, José María Joe Wicentowski wrote: > Hi José, > > Thanks for your e-mail. My understanding is that > request:redirect-to() redirects from one URL to another URL, i.e. if > someone requests: > page.xq?view=1 > we can redirect them to: > other.xq > > But is there a way to use request:redirect-to() to let someone request: > page/1 > and get the equivalent of > page.xq?view=1 > > Best, > Joe > > On Mon, Dec 1, 2008 at 9:38 AM, José María Fernández González > <jmf...@cn...> wrote: >> Hi Joe, >> you can use request:redirect-to($a as xs:anyURI) for that, so it can be >> embedded in your existing code. On Mon, Dec 1, 2008 at 1:15 PM, Wolfgang <wol...@ex...> wrote: >> 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 > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Exist-open mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-open > |