Как мне обслуживать CSS и JS в Go

Я следовал учебнику Go Writing Web Applications, но по какой-то причине у меня возникли проблемы с получением приложения для обслуживания CSS и JS. Если я запускаю свою статическую страницу без сервера Go, CSS страницы работает нормально. С другой стороны, когда я запускаю сервер Go, CSS просто не работает.

Вот как выглядит мой HTML-код:

<link rel="stylesheet" href="../assets/css/bootstrap.min.css">
<link rel="stylesheet" href="../assets/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="../assets/css/custom.css">

затем под тегом body:

<script src="../assets/js/jquery.min.js"></script>
<script src="../assets/js/bootstrap.min.js"></script>

Мое дерево файлов выглядит так:

go-affect/
├── data
│   └── …
├── static
│   ├── css
│   │   └── …
│   └── js
│   │   └── …
├── tmpl
│   ├── edit.html
│   ├── index.html
│   └── view.html
└── main.go

Как мне заставить мое приложение Go обслуживать нужные мне CSS и JavaScript?

С тех пор проблема была решена, вот рабочая главная:

func main() {
    http.HandleFunc("/view/", makeHandler(viewHandler))
    http.HandleFunc("/edit/", makeHandler(editHandler))
    http.HandleFunc("/save/", makeHandler(saveHandler))
    http.HandleFunc("/index/", makeHandler(indexHandler))


    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

    http.ListenAndServe(":8080", nil)
}

Вот пример используемых мной обработчиков:

func indexHandler(w http.ResponseWriter, r *http.Request, title string) {
    p := &Page{Title: title}
    err := templates.ExecuteTemplate(w, "index.html", p)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

Ответ 1

http.Handle("/", http.FileServer(http.Dir("css/")))

Будет обслуживать ваш каталог css в /. Конечно, вы можете обслуживать любой каталог по любому выбранному вами пути.

Вы, вероятно, хотите убедиться, что статический путь не мешает другим путям, и использовать что-то вроде этого.

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

Поместите ваши js и css в директорию static вашего проекта. Затем они будут обслуживаться по адресу domain.com/static/css/filename.css и domain.com/static/js/filename.js

Метод StripPrefix удаляет префикс, поэтому он не пытается искать, например, в static каталоге static/css/filename.css который, конечно, он не найдет. Он будет искать css/filename.css в static каталоге, что будет правильно.

Ответ 2

Я добавил ссылку на мой сервер Apache css dir в раздел head моих файлов шаблонов. Я храню шаблоны и файлы данных, используемые любым приложением go, в директории dir, из которой запущено приложение go. В этом случае cgi-bin.

Шаблон использует CSS из моего каталога Apache Server assets/css:

<link rel="stylesheet" href="/assets/css/main.css" />

запускайте приложения из моего каталога cgi-bin

листы sytle подаются из моих активов apache/css dir