2016-03-03 179 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