源起
考虑到内网的Pi不要浪费,且基于安全的考虑,想将我的这个博客搬到内网这个Pi服务器上,其实外网也可以访问wyyyh.3322.org。它是做过动态域名解析的,可惜80端口和443端口被电信是整没了的。
动手
因为Hugo的博客已经是静态页面,于是两分钟做了一个静态服务器。
package main
import (
"fmt"
"net/http"
)
func main() {
fmt.Println("Web server at 8181")
http.Handle("/", http.FileServer(http.Dir(".")))
http.ListenAndServe(":8181", nil)
}
Golang建立静态服务器确实简单,与Python一样。
升级
由于网上看到一些不错的404样式,希望在博客出现某些错误时,能显示有趣的样子。
之所以说不求甚解,是由于以下代码并不是常规的方式,会被高手鄙视。不过以快速解决,以及“能抓住老鼠就是好猫”的原则来处理了。
package main
import (
"os"
"fmt"
"net/http"
)
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
fmt.Println("Web server at 8181")
//http.Handle("/", http.FileServer(http.Dir(".")))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[1:]
if path=="" {
path="index.html"
}
exists,_ := PathExists(path)
if exists==false {
path="404.html"
}
http.ServeFile(w, r, path)
})
http.ListenAndServe(":8181", nil)
}
现在内网这个博客可以在出错时看到404了。
当然,这里处理得还有点问题,比如网页状态码应该改才对,先忽略吧。
另外,家里的Pi0完全可以做一个随身携带的博客,或者其它啥的。如果能更方便的配置Wifi接入的话,那就更好了。
再升级
话说都2020年了,都在提倡https,代码本身也很简单。
package main
import (
"fmt"
"net/http"
"os"
)
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
fmt.Println("Web server at 8181")
//http.Handle("/", http.FileServer(http.Dir(".")))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[1:]
if path == "" {
path = "index.html"
}
exists, _ := PathExists(path)
if exists == false {
path = "404.html"
}
http.ServeFile(w, r, path)
})
go http.ListenAndServe(":8181", nil)
http.ListenAndServeTLS(":8182", "./wyyyh.3322.org.crt", "./wyyyh.3322.org.key", nil)
主要是最后一句。这里同时开了http和https。
自动申请证书,可以使用 acme.sh 。它会自动验证域名,并生成证书。针对现在我这种动态域名解析而且没有80端口,它是无法验证的。现在想的办法是先将解析到公网正规服务器上,证书完成后再解析回来。