anchor.diff:  /// Filters an incoming HTTP request based on the request path (case insensitive).
   let routeCi (path : string) =
       fun (ctx : HttpHandlerContext) ->
  -        if String.Equals(ctx.HttpContext.Request.Path.ToString(), path, StringComparison.CurrentCultureIgnoreCase)
  +        if String.Equals(getRalativePath ctx.HttpContext, path, StringComparison.CurrentCultureIgnoreCase)
           then Some ctx
           else None
           |> async.Return
  
positive.code: /// route matches and subsequently passed into the supplied routeHandler.
  let routeCif (route : StringFormat<_, 'T>) (routeHandler : 'T -> HttpHandler) =
      fun (ctx : HttpHandlerContext) ->
          tryMatchInput route (ctx.HttpContext.Request.Path.ToString()) true
          |> function
              | None      -> None |> async.Return
              | Some args -> routeHandler args ctx
  
negative.code:                 ctx
                  |> (setHttpHeader "Content-Type" "text/html"
                  >>= setBodyAsString html)
          }
  
  let private handlerWithRootedPath (path:string) (handler : HttpHandler) = 
      fun (ctx : HttpHandlerContext) ->
          async {
              let route = getRoute ctx.HttpContext
              try
                  ctx.HttpContext.Items.Item RouteKey <- ((route |> Option.defaultValue "") + path)
                  return! handler ctx
              finally
                  match route with
                  | Some route -> ctx.HttpContext.Items.Item RouteKey <- route
                  | None       -> ctx.HttpContext.Items.Remove RouteKey |> ignore
          }
  
  let subPath (path:string) (handler : HttpHandler) =
      route path >>=
      handlerWithRootedPath path handler
  
  let subCiPath (path:string) (handler : HttpHandler) =
      routeCi path >>=
      handlerWithRootedPath path handler
  