diff --git a/Network/Wai/Middleware/Vhost.hs b/Network/Wai/Middleware/Vhost.hs
--- a/Network/Wai/Middleware/Vhost.hs
+++ b/Network/Wai/Middleware/Vhost.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
-module Network.Wai.Middleware.Vhost (vhost, redirectWWW) where
+module Network.Wai.Middleware.Vhost (vhost, redirectWWW, redirectTo, redirectToLogged) where
 
 import Network.Wai
 
@@ -7,6 +7,7 @@
 import qualified Data.Text.Encoding as TE
 import Data.Text (Text)
 import qualified Data.ByteString as BS
+import Data.Monoid (mappend)
 
 vhost :: [(Request -> Bool, Application)] -> Application -> Application
 vhost vhosts def req =
@@ -15,9 +16,20 @@
         (_, app):_ -> app req
 
 redirectWWW :: Text -> Application -> Application -- W.MiddleWare
-redirectWWW home app req =
-  if maybe True (BS.isPrefixOf "www") $ lookup "host" $ requestHeaders req
-    then return $ responseLBS H.status301
-          [ ("Content-Type", "text/plain") , ("Location", TE.encodeUtf8 home) ] "Redirect"
+redirectWWW home =
+  redirectIf home (maybe True (BS.isPrefixOf "www") . lookup "host" . requestHeaders)
+
+redirectIf :: Text -> (Request -> Bool) -> Application -> Application
+redirectIf home cond app req =
+  if cond req
+    then return $ redirectTo $ TE.encodeUtf8 home
     else app req
 
+redirectTo :: BS.ByteString -> Response
+redirectTo location = responseLBS H.status301
+    [ ("Content-Type", "text/plain") , ("Location", location) ] "Redirect"
+
+redirectToLogged :: (Text -> IO ()) -> BS.ByteString -> IO Response
+redirectToLogged logger loc = do
+  logger $ "redirecting to: " `mappend` TE.decodeUtf8 loc
+  return $ redirectTo loc
diff --git a/wai-extra.cabal b/wai-extra.cabal
--- a/wai-extra.cabal
+++ b/wai-extra.cabal
@@ -1,5 +1,5 @@
 Name:                wai-extra
-Version:             2.0.2
+Version:             2.0.3
 Synopsis:            Provides some basic WAI handlers and middleware.
 Description:         The goal here is to provide common features without many dependencies.
 License:             MIT
