2017-09-25 4 views
1

Ich verwende http.FileServer in Go, um einige statische Dateien in einem Verzeichnis bereitzustellen. Dies istVerzeichnis, das falsche Links in Golang auflistet http.FileServer()

, wie ich es Karte mit Mux als Router:

r.PathPrefix("/download").Handler(http.StripPrefix("/download", http.FileServer(http.Dir(dirPath)))).Methods("GET") 

wo dirPath einen absoluten Pfad eines Verzeichnisses in meinem Dateisystem ist.

Nun scheint es gut zu funktionieren, wenn das Verzeichnis mit localhost-Eintrag zu fragen: 8080/herunterladen, weil es eine Seite wie diese

<pre> 
<a href="a.xml">a.xml</a> 
<a href="b.xml">b.zip</a> 
</pre> 

Leider sind die Links sind gebrochen zurück, weil ich sie erwarten abgebildet werden, für Beispiel zu localhost:8080/download/a.xml, während Dateiserver sie auf localhost:8080/a.xml abbildet.

Wie kann ich in meinem Verzeichniseintrag den Pfadpfad /download in Links beibehalten?

Antwort

2

Das Problem ist das Muster, das Sie Handler registrieren mit: "/download".

Es gibt zwei Probleme mit sich:

  1. Die generierten URLs falsch sind, weil die Prozedur durch die http.FileServer() Funktion zurück relativ URLs auf Dateien und Unterordner erzeugt; relativ zum Stammordner, der an http.FileServer() übergeben wurde, und wenn Ihre Seite unter dem Pfad /download verfügbar ist, wird eine relative URL wie href="a.xml" in /a.xml aufgelöst und nicht in /download/a.xml.

  2. Selbst wenn die URLs gut wären, würden die Dateien nicht bedient, da die Anfragen nicht an Ihre Handle weitergeleitet würden (an den Dateiserver-Handler). Sie müssen einen abschließenden Schrägstrich hinzufügen, da "/download" nur diesem einzelnen Pfad entspricht und nicht alle Pfade damit beginnen. Fügen Sie einen abschließenden Schrägstrich hinzu: "/download/", und es wird dem verwurzelten Teilbaum /download/* entsprechen.

So ist die Lösung:

r.PathPrefix("/download/").Handler(
    http.StripPrefix("/download", http.FileServer(http.Dir(dirPath))), 
).Methods("GET") 

Dies ist bei http.ServeMux dokumentiert:

Patterns Namen fest verwurzelt Wege, wie "/favicon.ico" oder verwurzelte Unterbäume, wie "/ images /" (beachten Sie den Schrägstrich).

Beachten Sie, dass, obwohl wir jetzt die "/download/" registrierten Pfad verwenden, werden Benutzer nicht den Schrägstrich im Browser eingeben erforderlich, wie aus den Server verlassen wird eine Umleitung auf den Weg schicken, die mit einem Ende Schrägstrich. Dies wird automatisch geschehen. Dies wird auch bei http.ServeMux dokumentiert:

Wenn ein Unterbaum registriert wurde und eine Anforderung empfangen wird, ohne seinen Schrägstrich die Teilbaumwurzel Namensgebung ServeMux umleitet, die Anforderung an die Teilbaumwurzel (Hinzufügen des Schrägstrichs). Dieses Verhalten kann mit einer separaten Registrierung für den Pfad ohne den abschließenden Schrägstrich außer Kraft gesetzt werden. Wenn Sie beispielsweise "/ images /" registrieren, veranlasst ServeMux, eine Anforderung für "/ images" an "/ images /" umzuleiten, sofern "/ images" nicht separat registriert wurde.

lesen Verwandte Frage: Go web server is automatically redirecting POST requests

Hier ist eine einfache Datei-Server-Anwendung nur die Standard-Bibliothek:

http.Handle("/dl/", 
    http.StripPrefix("/dl", http.FileServer(http.Dir("/home/bob/Downloads"))), 
) 
panic(http.ListenAndServe("localhost:8080", nil)) 
+0

Du hast Recht. Ist der Aufrufer gezwungen, den folgenden Schrägstrich in URL einzugeben: localhost: 8080/download /? –

+0

@AndreaCastello Nein, es wird nicht benötigt, da der Server eine Weiterleitung sendet und der Browser dies automatisch verfolgt. Siehe bearbeitete Antwort. Versuch es selber. – icza

+0

@AndreaCastello Bitte lesen Sie die überarbeitete Antwort, zusätzliche Erklärungen zu den falschen URLs. – icza

Verwandte Themen