去http:服务/静态和/静态/之间的区别

时间:2016-03-03 19:44:21

标签: http go handler

我对http.FileServer和斜杠感到非常困惑。

我需要将脚本提供给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,但我没有实际的证明方法。

1 个答案:

答案 0 :(得分:0)

http.Handle("/static", http.StripPrefix("/static", fs))注册固定名称模式。

http.Handle("/static/", http.StripPrefix("/static/", fs))注册 rooted子树模式。

前者只匹配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