Initially godlighty has basic static files handlers (with compression,
HTTP preconditions are enabled of course). In the example below there
are nearly all default functions. Also look for rc/example.cfg.

    Hosts["example.com"] = &godlighty.HostCfg{
        Root: "/www/example.com",
        EdDSATLS: &godlighty.TLSCfg{
            Cert: "/path/to/example.com.pem",
            Key: "/path/to/example.com.key.pem",
            CACert: "/path/to/ca.pem",
        },
        DirList: true,
        WebDAV: true,
        MIMEs: map[string]string{
            ".special": "text/x-special-type",
        },
    }

If your keys and certificates are in single file and you use common CA
certificate, then it is trivial to DRY:

    var (
        Etc = "/whatever"
        CACert = path.Join(Etc, "ca.pem")
    )

    func newTLSCfg(host string) *godlighty.TLSCfg {
        return &godlighty.TLSCfg{
            Cert:   path.Join(Etc, host+".pem"),
            Key:    path.Join(Etc, host+".pem"),
            CACert: CACert,
        }
    }

But there are hooks that can do anything more. For example if you want
to run CGI script or make a redirection (FastCGI handler example is in
rc/fcgi.example.cfg):

    HostCfg{
        ...,
        Hooks: []godlighty.Hook{
            func(w http.ResponseWriter, r *http.Request) bool {
                if r.URL.Path == "/" {
                    http.Redirect(w, r, "//here.we.go/", http.StatusMovedPermanently)
                    return true
                }
                return false
            },
            func(w http.ResponseWriter, r *http.Request) bool {
                cgi.Handler{
                    Path: "/usr/local/libexec/git-core/git-http-backend",
                    Dir:  "/var/empty",
                    Env: []string{
                        "GIT_PROJECT_ROOT=" + root,
                        "GIT_HTTP_EXPORT_ALL=",
                    },
                }.ServeHTTP(w, r)
                return true
            },
        },

You can separate your configuration files and add them through init() call:

    $ ls rc/stargrave.org.cfg
    blog.stargrave.org.go
    ca.cypherpunks.ru.go
    cgi.go
    cryptoanarchy.ru.go
    git.go
    go.go
    if.mirror.cypherpunks.ru.go
    lists.cypherpunks.ru.go
    static.go
    tls.go
    [...]

    $ cat rc/stargrave.org.cfg/static.go
    package rc

    import "path"

    func addStaticCfg(host, root string) {
        if !path.IsAbs(root) {
            root = path.Join(WWW, root)
        }
        godlighty.Hosts[host] = &godlighty.HostCfg{
            Root: root,
            TLS:  newTLSCfg(host),
        }
    }

    func addStaticListedDir(host, root string) {
        addStaticCfg(host, root)
        godlighty.Hosts[host].DirList = true
        godlighty.Hosts[host].WebDAV = true
    }

    func init() {
        [...]
        addStaticCfg("paster.stargrave.org", "/storage/paster/pastes")
        addStaticCfg("www.godlighty.stargrave.org", "godlighty.stargrave.org")
        addStaticCfg("www.nncpgo.org", "nncpgo.org")
        addStaticListedDir("www.mds.cypherpunks.su", "/storage/audiobook/mds")
        [...]
    }

There are some pre-existing helpers to deal with:

rc/cgi.go
    CGI scripts.

rc/redirect.go
    Loggable redirects.

rc/mime.go, rc/mime/*
    Predefined Content-Type entries. Each file in rc/mime/* has
    tab-separated format: file's extension, media type and optional
    "c" mark, meaning that these type can be transparently compressed
    on-the-fly.