2016-03-25 16 views
0

静的なHTMLファイルを提供しようとしていますが、このファイルには他のリソースを指すスクリプトタグがあります。私は1つのディレクトリからhtmlファイルを提供したいが、アセットの要求を別のディレクトリにリダイレクトする。これは私が今それを設定してい方法である:ここでは静的ファイルのリダイレクト要求

// server.go 
import (
    "fmt" 
    "html/template" 
    "log" 
    "net/http" 
    "path" 
    "time" 
) 

func handle(w http.ResponseWriter, r *http.Request) { 
    lp := path.Join("./", "index.html") 
    fmt.Println(lp) 
    tmpl, err := template.ParseFiles(lp) 
    if err != nil { 
     log.Fatal(err) 
    } 
    tmpl.ExecuteTemplate(w, "index", nil) 
} 

func main() { 
    fs := http.FileServer(http.Dir("../../app_assets/")) 
    http.Handle("/assets", fs) 
    http.HandleFunc("/static/", handle) 

    fmt.Println("Go Server listening on port 8000") 
    http.ListenAndServe(":8000", nil) 
} 

は私のテンプレートです:

<!-- index.html --> 
{{define "index"}} 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<link rel="stylesheet" href="assets/css/libs.css" type="text/css" /> 
</head> 

<body> 
<script type="text/javascript" src="assets/js/libs.js"></script> 

<h1> Hello </h1> 
</body> 
</html> 
{{end}} 

私はlocalhost:8000/static/からインデックスファイルを提供することができるよ、しかし、資産要求はするつもりはありません資産フォルダは2レベル上になります(../../)。私は間違って何をしていますか?

注:

libs.jsがロードされたときに、私は、コンソールでこのエラーを取得しています:これはlibs.jsファイルに対する要求はにリダイレクトされていることを信じるように私をリード

Uncaught SyntaxError: Unexpected token < 

HTMLマークアップ。

どうしてですか?

注2:私はlibs.jsのための要求の結果を参照すると

が、私はHTMLマークアップを参照してください。下のアドバイスとしてStripPrefixを使用した後でさえ。私は間違って何をしていますか?

+0

絶対パスを使用し、問題を回避します。 – elithrar

+0

@elithrarの例ですか? – dopatraman

答えて

0

あなたのcssとjsのsrc属性を指定すると、src="assets/js/libs.js"になります。これにより、これらのファイルは現在のパスからの相対パスで要求されます。したがって、要求はhttp://localhost:8000/static/assets/js/libs.jsに行きます。

これは/staticという接頭辞が付いているため、/staticハンドラによって処理されるため、htmlファイルが処理されます。

ハンドブックを/assetsにするには、/の接頭辞を付けてsrcと指定します。

これで、サーバーは../../app_assets/assets/js/libs.jsというファイルを検索します。

../../app_assets/js/libs.jsにする場合は、StripPrefixを使用して、サーバーのURLからassets部分を取り出すことができます。

fs := http.StripPrefix("/assets/", http.FileServer(http.Dir("../../app_assets/"))) 
http.Handle("/assets/", fs) 
+0

'src'属性が'/assets/* 'を指さないならば、サーバに設定されたルートハンドラは正しくヒットしませんか? – dopatraman

+0

ああ。右! StripPrefixを使用します。 –

+0

私はdownvoteを取得しません:(特に私は間違いを訂正した後に答えの残りの部分はOPに非常に役立つはずです –

0

だから私はそれが少し混乱だけど、あなたはその理由は、あなたがそれを持っているとして、それが本当にあるので、「資産」のパスがすでに要求で指定されていることであるfs := http.FileServer(http.Dir("../.."))

するfs := http.FileServer(http.Dir("../../assets/"))を変更したいです../../assets/assets/*を指しています

希望に役立ちます!

oh他のエラーを防ぐには、パスに末尾にスラッシュを付けてHandle()関数を記述する必要があります。私はそれを忘れることをほとんど忘れていた。

EDIT

次にサーバーを準備するでしょう、あなたのユースケースについてhttp.StripPrefixハンドラhttps://golang.org/pkg/net/http/#StripPrefix

を使用する必要があると思います(リダイレクトのいくつかの並べ替えを使用して)他の必要性のための私の答えを調整するにはコード:

fs := http.FileServer(http.Dir("../../app_assets")) 
http.Handle("/assets/", http.StripPrefix("/assets/", fs)) 

これにより、ファイルシステムのサービスのURL書き換えを行うことができます。

+0

別の名前のフォルダを使用する場合はどうすればよいですか?言うように、 '../../ app_assets'やそのようなものを指していますか?私はあなたが私が何を意味するかを見ることができるように質問を更新しました。 – dopatraman

+0

これについては私の更新を見てください:)それが役に立ったら –

+0

まだ動作しません。このエラーを取得する: 'Uncaught SyntaxError:予期せぬトークン<' – dopatraman

関連する問題