Keep in mind that Lift's behavior for 404s differs between development and production mode in Lift 1.1-xxx
To have your app/Lift handle a 404 rather than passing it to your web container, in Boot.scala: LiftRules.passNotFoundToChain = false LiftRules.uriNotFound.prepend { case _ => XhtmlResponse((<html> <body>Silly goose</body> </html>), Empty, List("Content-Type" -> "text/html; charset=utf-8"), Nil, 404, S.ieMode) } In development mode, Lift will tell you about SiteMap as this was a common confusion point among new developers. In production mode, Lift will use that code. To put Lift in production mode: mvn -Drun.mode=production jetty:run I would strongly recommend against a "catch-all" entry in SiteMap as it will expose every page on your site to access. On Tue, Dec 29, 2009 at 11:17 AM, Alex Black <a...@alexblack.ca> wrote: > Ok, I got this working, with 1.1-M8 using S.render. > > // A node which embeds our 404 template (e.g. 404.html) > val notFoundNode = > <lift:embed what="404" /> > > // Catch 404s > LiftRules.uriNotFound.prepend { > case (req, _) => XhtmlTemplateResponse(notFoundNode, 404) > } > > // If you're using a sitemap, make sure you have a catch-all item, > e.g > // Menu(Loc("Catchall", Pair(Nil, true), "", Hidden :: Nil)) :: > > using this object: > > object XhtmlTemplateResponse extends HeaderStuff { > def apply(nodeToRender: Node, statusCode: Int): LiftResponse = { > val renderedNode = S.render(nodeToRender, > S.request.get.request).first > new XhtmlResponse(renderedNode, Empty, headers, cookies, > statusCode, false) > } > } > > I think the wiki page: > http://wiki.liftweb.net/index.php/Setting_up_a_custom_404_page > should be updated. The current code hides the 404 status code and > changes the url. > > I'd offer to write the new wiki page - is there a way for me to get an > account on that wiki - or is it just for contributors? > > - Alex > > On Dec 29, 1:20 pm, Alex Black <a...@alexblack.ca> wrote: > > > If you want to display the contents of your 404.html, checkout > NodeResponse... just load up your template using the template helpers (this > will give you NodeSeq) and then you can present that back to the user. Job > done. > > > > I am familiar with NodeResponse and its subclasses. I've used them in > > our REST api. But, what I can't figure out, is how to use them in > > conjuction with the templating engine as you seem to be alluding to > > (with the template helpers). > > > > Can you point me in the right direction? I am going to try switching > > to M8 and then using S.render like this: > > > > val node404 = <lift:surround with="default" at="content"> > > <h1>Not Found</h1> > > </lift:surround> > > > > LiftRules.uriNotFound.prepend { > > case (req, _) => XhtmlResponse(S.render(node404, req), _, > > headers, cookies, 404, false) > > } > > > > > > > > > Cheers, Tim > > > > > On 29 Dec 2009, at 15:23, Alex Black wrote: > > > > > > But of course RewriteResponse is not a LiftResponse. Whats the best > > > > way to do this? Basically I've got a template called 404.html which > > > > I'd like to display whenever there is a 404. > > > > > > I Just thought of something, perhaps I could add a RewriteRule that > > > > matches everything? > > -- > > You received this message because you are subscribed to the Google Groups > "Lift" group. > To post to this group, send email to lift...@googlegroups.com. > To unsubscribe from this group, send email to > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/liftweb?hl=en. > > > -- Lift, the simply functional web framework http://liftweb.net Beginning Scala http://www.apress.com/book/view/1430219890 Follow me: http://twitter.com/dpp Surf the harmonics -- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.