2014-03-26 53 views
5

这一定是非常愚蠢的事情。我刚开始玩scotty,无法正确获取静态内容。Web Scotty:提供静态文件时找不到文件

import Network.HTTP.Types 
import Web.Scotty 
import qualified Data.Text as T 
import Data.Monoid (mconcat) 
import Data.Aeson (object, (.=)) 
import Network.Wai.Middleware.Static 

main = scotty 3000 $ do 
    middleware $ staticPolicy (noDots >-> addBase "static") 
    get "/" $ file "index.html" 

很简单。这就是你在几个scotty教程中找到的。但是由于某种原因它不起作用。在浏览器中通过'/'访问给我'文件未找到'的东西。 如果我在浏览器中输入“/index.html”,它就会起作用。但它是错的!我希望它可以通过'/'而不是'/index.html'访问。它忽略根目录并直接获取html文件。我如何通过'/'root来为index.html提供服务?没有太多的信息和一些教程,我发现指向上面的例子或类似的不能按预期工作。

我试着将头文件设置为'text/html',什么不是...没有运气。

回答

4

如果我在浏览器中键入'/index.html' - 它可以工作。但它是错的!我希望它可以通过'/'而不是'/index.html'访问。

但这正是staticPolicy中间件的用途!只要请求与策略匹配(本例中为./static/中的文件),它就会被staticPolicy过滤。如果您不想要这种行为,请移除中间件。

通过浏览器中的'/'访问给我'文件未找到'的东西。

因为middlware操作未设置以下命令的相对路径。您需要提供file的完整路径:

main = scotty 3000 $ do 
    get "/" $ file "./static/index.html" 
+0

谢谢您的回答。所以,如果我理解正确,'文件'函数需要一个相对于当前工作目录的文件路径,并且与中间件暴露的静态目录无关,对吧?这有点令人困惑,因为它看起来像我不需要中间件来提供静态html文件,而网络上的一些scotty例子却让你不这么想。看来中间件静态策略只需要暴露css和javascript文件而不是实际的html文件。 –

+0

当你不想为每个文件显式路由时,中间件将会很有用 – Carsten