diff --git a/Network/Web/HTTP.hs b/Network/Web/HTTP.hs
--- a/Network/Web/HTTP.hs
+++ b/Network/Web/HTTP.hs
@@ -26,7 +26,7 @@
 import Network.Web.Params
 import Network.Web.URI
 import System.IO
-import System.IO.Error hiding (try)
+import System.IO.Error (isEOFError, ioeGetErrorType)
 import Text.Printf
 
 ----------------------------------------------------------------
diff --git a/Network/Web/Server/Basic.hs b/Network/Web/Server/Basic.hs
--- a/Network/Web/Server/Basic.hs
+++ b/Network/Web/Server/Basic.hs
@@ -10,6 +10,7 @@
 
 {-# OPTIONS -Wall #-}
 module Network.Web.Server.Basic (serveHTTP,
+                                 serveHTTPMapIO,
                                  basicServer,
                                  module Network.Web.Server.Params) where
 
@@ -46,6 +47,7 @@
 
 {-|
   Run an HTTP server, using a default BasicConfig.
+  If you need to perform IO in the site mapping function (e.g. to check for the existence of files), use 'serveHTTPMapIO',
 -}
 serveHTTP :: Maybe FilePath -- ^ Directory to write logfiles, "access.log" and "error.log".  Will be created if it doesn't exist.
                             -- if Nothing, errors will be written to stderr
@@ -53,7 +55,20 @@
           -> S.ByteString   -- ^ Server name
           -> (Request -> Path)  -- ^ site mapping function
           -> IO ()
-serveHTTP m'logPath httpPort servName sitemap = do
+serveHTTP m'logPath httpPort servName sitemap =
+    serveHTTPMapIO m'logPath httpPort servName (return . sitemap)
+
+{-|
+  Run an HTTP server, using a default BasicConfig.
+  Can perform IO in the site mapping function.
+-}
+serveHTTPMapIO :: Maybe FilePath -- ^ Directory to write logfiles, "access.log" and "error.log".  Will be created if it doesn't exist.
+                                 -- if Nothing, errors will be written to stderr
+               -> Int            -- ^ HTTP port
+               -> S.ByteString   -- ^ Server name
+               -> (Request -> IO Path)  -- ^ site mapping function, in IO
+               -> IO ()
+serveHTTPMapIO m'logPath httpPort servName sitemapIO = do
     (accHandler,errHandler,logwait) <- case m'logPath of
         Nothing -> return (const (return ()), hPutStrLn stderr, return ())
         Just logPath -> do
@@ -85,7 +100,7 @@
         topHandler tcpi = basicServer $ defaultConfig {
               serverName = servName
             , tcpInfo = tcpi
-            , mapper = sitemap
+            , mapper = sitemapIO
             }
         runserver = withSocketsDo $ do
             sock <- listenOn (PortNumber $ fromIntegral httpPort)
@@ -204,7 +219,7 @@
 lookupAndParseDate key req = lookupField key req >>= parseDate
 
 tryGet :: BasicConfig -> Request -> [String] -> IO (Maybe Response)
-tryGet cnf req langs = tryGet' $ mapper cnf req
+tryGet cnf req langs = tryGet' =<< mapper cnf req
   where
     tryGet' None          = return Nothing
     tryGet' (File file)   = tryGetFile cnf req file langs
@@ -276,7 +291,7 @@
 ----------------------------------------------------------------
 
 tryHead :: BasicConfig -> Request -> [String] -> IO (Maybe Response)
-tryHead cnf req langs = tryHead' (mapper cnf req)
+tryHead cnf req langs = tryHead' =<< mapper cnf req
   where
     tryHead' None        = return Nothing
     tryHead' (PathCGI _) = return Nothing
@@ -308,9 +323,10 @@
       else Just uri { uriPath = path `S.append` "/" }
 
 tryRedirect :: BasicConfig -> Request -> [String] -> IO (Maybe Response)
-tryRedirect cnf req langs = maybe (return Nothing)
-    (\ruri -> tryRedirect' (mapper cnf $ rreq ruri) ruri)
-    (redirectURI uri)
+tryRedirect cnf req langs = case redirectURI uri of
+    Nothing   -> return Nothing
+    Just ruri -> do path <- mapper cnf $ rreq ruri
+                    tryRedirect' path ruri
   where
     uri = reqURI req
     rreq ruri = req {reqURI = ruri}
@@ -330,7 +346,9 @@
 ----------------------------------------------------------------
 
 tryPost :: BasicConfig -> Request -> IO Response
-tryPost cnf req = case mapper cnf req of
+tryPost cnf req = do
+  path <- mapper cnf req
+  case path of
     PathCGI cgi -> fromMaybe undefined <$> tryGetCGI cnf req cgi
     Handler resp-> resp
     _           -> return responseBadRequest
diff --git a/Network/Web/Server/CGI.hs b/Network/Web/Server/CGI.hs
--- a/Network/Web/Server/CGI.hs
+++ b/Network/Web/Server/CGI.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings, CPP #-}
 
+{-# OPTIONS_GHC -fno-warn-dodgy-imports #-}
 module Network.Web.Server.CGI (tryGetCGI) where
 
 import Prelude hiding (catch)
diff --git a/Network/Web/Server/Params.hs b/Network/Web/Server/Params.hs
--- a/Network/Web/Server/Params.hs
+++ b/Network/Web/Server/Params.hs
@@ -17,7 +17,7 @@
 -}
 data BasicConfig = BasicConfig {
    -- | A mapper from 'URI' to 'Path'.
-   mapper :: Request -> Path
+   mapper :: Request -> IO Path
    -- | Resource obtaining function. The second argument is
    --   (offset of the resource, and length from the offset).
  , obtain :: FilePath -> Maybe (Integer,Integer) -> IO L.ByteString
diff --git a/webserver.cabal b/webserver.cabal
--- a/webserver.cabal
+++ b/webserver.cabal
@@ -1,5 +1,5 @@
 Name:                   webserver
-Version:                0.6.0.1
+Version:                0.7.0.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             John W. Lato <jwlato@gmail.com>
 License:                BSD3
