我对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
,但我没有实际的证明方法。
答案 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