2016-03-03 178 views
0

我對http.FileServer和斜線有一個可怕的混淆。轉到http:服務/靜態和/靜態之間的區別/

我需要爲html頁面提供腳本。在我工作的目錄中,我有頁面index.html,我有一個static目錄,裏面有myscript.js

第一個問題:是不是正確的寫

<script src="/static/myscript.js"></script> 

?我也看到了src="static/myscript.js",我不知道是否有使用其中一個的原因(但我想它會影響我們必須在服務器上編寫的處理程序)。

讓我們假設我們解決了第一個版本。第二個問題:在服務器端,我想註冊static目錄的處理程序。通過this example啓發,我做的:

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

但我得到一個404。但是,如果我使用:

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

與結束斜線,它工作正常!

我對網絡服務器真的很陌生,所以我將不勝感激任何解釋,包括什麼是函數傳遞的實際地址。例如,我不知道(並且我無法從net/http文檔中找到它)在提供/static請求時傳遞給處理程序的地址是什麼。我想這是/static/myscript.js,因爲我們使用http.StripPrefix,但我沒有實際的方法來證明它。

+0

相關:[爲什麼我需要使用http.StripPrefix來訪問我的靜態文件?](http:// stackoverflow。com/questions/27945310/why-do-i-need-to-use-http-stripprefix-to-access-my-static-files) – icza

回答

0

http.Handle("/static", http.StripPrefix("/static", fs))註冊一個固定名稱模式。

http.Handle("/static/", http.StripPrefix("/static/", fs))註冊一個根植子樹模式。

前者只匹配URL.path = "/static"。後者匹配以"/static/"開頭的每條路徑。 404表示它無法匹配給定請求的任何模式,而不是找不到請求的文件。 (它甚至沒有得到執行FileServer的處理程序!)


並回答你的第一個問題:

<script src="/static/myscript.js"></script> 

網址,開始以斜線/絕對。這意味着你在哪個頁面上並不重要,它總是會附加到域名上,例如example.com/some/page + /static/myscript.js = example.com/static/myscript.js

<script src="static/myscript.js"></script> 

是一個相對路徑。這意味着它將被附加到當前訪問頁面的URL上,例如example.com/some/page + static/myscript.js = example.com/some/page/static/myscript.js

+0

很好的解釋@ fl0cke! +1! – rodrigolece