2017-07-02 12 views
0

Donc, chaque fois que j'essaie d'accéder à des fichiers dans mon sous-répertoire statique, je reçois juste un 404, non trouvé, Accessing Home/d'autre part fonctionne très bien, mais une image que j'appelle à partir du fichier d'origine est tout simplement cassé :(, donc je voudrais savoir ce qu'il faut changer pour que je puisse servir des fichiers et rediriger mon répertoire racine en même tempsFileserver renvoie 404 pour tous les fichiers

ma structure de chemin.

root/ 
->html 
->static 
->entry.go 

J'ai vu les autres threads ici, ils recommandent tous que je fais r.PathPrefix ("/"). Handler (...), mais cela fait en sorte d'accéder à n'importe quel fichier en dehors des retours statiques NIL, y compris mes fichiers html sont dans un fichier html séparé à la racine de mon projet, en outre, rediriger vers l'un d'entre eux renvoie 404, introuvable.

Voici le code:

package main 

import (
    "fmt" 
    "net/http" 
    "html/template" 
    "github.com/gorilla/mux" 
    "os" 
) 

func IfError(err error, quit bool) { 
    if err != nil { 
    fmt.Println(err.Error()) 
    if(quit) { 
     os.Exit(1); 
    } 
    } 
} 

func NotFound(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(404) 
    t, _ := template.ParseFiles("html/404") 
    err := t.Execute(w, nil) 
    IfError(err, false) 
} 

func Home(w http.ResponseWriter, r *http.Request) { 
    t, _ := template.ParseFiles("html/home") 
    err := t.Execute(w, nil) 
    IfError(err, false) 
} 

func RedirectRoot(servefile http.Handler) http.Handler { 
    return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { 
    if r.URL.Path == "/" { 
     redirect := r.URL.Host+"/home" 
     http.Redirect(w, r, redirect, http.StatusSeeOther) 
    } else { 
     servefile.ServeHTTP(w, r) 
    } 
    }) 
} 

func main() { 
    r := mux.NewRouter() 
    ServeFiles := http.StripPrefix("/", http.FileServer(http.Dir("static/"))) 
    r.Handle("/", RedirectRoot(ServeFiles)) 
    r.HandleFunc("/home", Home) 
    r.NotFoundHandler = http.HandlerFunc(NotFound) 

    fmt.Printf("Listening ...") 
    IfError(http.ListenAndServe(":8081", r), true) 
} 

Merci beaucoup

Répondre

0

La question que je vois dans votre code

r.Handle("/", RedirectRoot(ServeFiles)) 

Il correspondra à chaque itinéraire, peut produire des résultats inattendus. Au lieu de cartographier vos routes clairement et explicitement, il fonctionnera comme prévu.

Par exemple: Affectons la responsabilité du gestionnaire. Cette approche est basée sur la structure de votre répertoire.

Il n'expose que le répertoire static via le serveur de fichiers, les fichiers restants et le répertoire racine sont sécurisés.

func main() { 
    r := mux.NewRouter() 
    r.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) 
    r.HandleFunc("/home", Home) 
    r.NotFoundHandler = http.HandlerFunc(NotFound) 

    fmt.Printf("Listening ...") 
    IfError(http.ListenAndServe(":8081", r), true) 
} 

RedirectRoot peut ne pas être nécessaire à vos besoins.

Maintenant, /static/* servi par http.FileServer et /home géré par Home.


EDIT:

Comme demandé dans le commentaire. Pour mapper la racine / au gestionnaire de rattachement et /favicon.ico, ajoutez le suivant en plus de l'extrait de code ci-dessus.

func favIcon(w http.ResponseWriter, r *http.Request) { 
    http.ServeFile(w, r, "static/favicon.ico") 
} 

r.HandleFunc("/favicon.ico", favIcon) 
r.HandleFunc("/", Home) 

favicon.ico servi de static répertoire.

+0

Mais je veux que mon répertoire racine redirige vers home /, l'accès au site web avec votre imlementation me donnera un 404, Not found, et le favicon.ico ne sera pas chargé non plus – Whiteclaws

+0

Ajouté plus de détails à la réponse, s'il vous plaît avoir un regard. – jeevatkm