2014-03-26 9 views
5

Das muss etwas wirklich dumm sein. Ich habe gerade angefangen mit Scotty zu spielen und kann den statischen Inhalt nicht richtig bedienen.Web Scotty: Datei nicht gefunden, während statische Dateien dienen

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" 

Ziemlich einfach. Das finden Sie in ein paar skotty Tutorials. Aber es funktioniert nicht aus irgendeinem Grund. Der Zugriff über '/' im Browser gibt mir die 'Datei nicht gefunden' Sache. Wenn ich '/index.html' im Browser eintippe - funktioniert es. Aber es ist falsch! Ich möchte, dass es über '/' zugänglich ist, aber nicht '/index.html'. Es ignoriert die Wurzel und nimmt die HTML-Datei direkt auf. Wie kann ich index.html über '/' root bereitstellen? Es gibt nicht viele Informationen in der Umgebung und ein paar Tutorials, die ich gefunden habe, zeigen auf das obige Beispiel oder ähnliches, das nicht wie erwartet funktioniert.

Ich habe versucht, die Header auf 'Text/HTML' und was nicht ... Kein Glück.

Antwort

4

Wenn ich '/index.html' im Browser eintippe - funktioniert es. Aber es ist falsch! Ich möchte, dass es über '/' zugänglich ist, aber nicht '/index.html'.

Aber das ist genau das, was die staticPolicy Middleware ist! Wenn eine Anfrage mit einer Richtlinie übereinstimmt (in diesem Fall Dateien in ./static/), wird sie nach staticPolicy gefiltert. Wenn Sie dieses Verhalten nicht möchten, entfernen Sie die Middleware.

Der Zugriff über '/' im Browser gibt mir die 'Datei nicht gefunden' Sache.

Da die Middlware-Aktion den relativen Pfad für die folgenden Befehle nicht festlegt. Sie müssen den vollständigen Pfad für file eingeben:

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

Vielen Dank für Ihre Antwort. Also, wenn ich es richtig verstehe, nimmt die 'Datei'-Funktion einen Dateipfad relativ zum aktuellen Arbeitsverzeichnis und hat nichts mit dem statischen Middleware-Verzeichnis zu tun, oder? Es ist ein bisschen verwirrend, da es so aussieht, als ob ich die Middleware nicht brauche, um statische HTML-Dateien zu liefern, während die wenigen skotty-Beispiele im Netz dich anders denken lassen. Es scheint, dass statische Middleware-Richtlinien nur benötigt werden, um CSS- und Javascript-Dateien und nicht die eigentlichen HTML-Dateien zu enthüllen. –

+0

die Middleware ist nützlich, wenn Sie keine explizite Route für jede Ihrer Dateien wünschen – Carsten

Verwandte Themen