2017-07-02 10 views
0

静的サブディレクトリ内のファイルにアクセスしようとすると、404、Not Found、Homeing /にアクセスできますが、他の手ではうまく動作しますが、自宅ファイルから単に:(壊れている、だから私は、私はファイルを提供すると同時に、私のルートディレクトリにリダイレクトすることができるように変更するには何を知りたいのですFileserverはすべてのファイルに対して404を返します

私のパス構造:。

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

他のスレッドがここにあり、r.PathPrefix( "/")。Handler(...)を実行することをお勧めしますが、静的な外部ファイルにアクセスすると、私のプロジェクトのルートにある別のhtmlファイルにあります。さらに、いずれかにリダイレクトすると404、Not Foundが返されます。

ここでは、コードです:

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) 
} 

は、それは予期しない結果が生じることがあり、すべてのルートにマッチします、私はあなたのコードで参照問題

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

非常

答えて

0

、ありがとうございました。代わりに、あなたのルートをはっきりと明示的にマップしてください。

例:ハンドラを責任を持ってマッピングしましょう。このアプローチは、ディレクトリ構造に基づいています。

これはファイルサーバー経由でstaticディレクトリを公開し、残りのファイルとルートディレクトリは安全です。

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は、目的には必要ない場合があります。

http.FileServer/homeが処理します。Homeが処理されます。


EDIT:

コメントに尋ねたよう。ルート/をホームハンドラに、/favicon.icoをルートにマッピングするには、上記のコードスニペットに加えて以下を追加します。

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

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

favicon.icostaticディレクトリから提供。

+0

私のルートディレクトリを自宅にリダイレクトしたい、あなたのimlementationでウェブサイトにアクセスすると404が見つかりません、favicon.icoはロードされません – Whiteclaws

+0

答えにさらに詳しい情報を追加してください一見。 – jeevatkm

関連する問題