Подтвердить что ты не робот

Как вы обслуживаете статический html файл с помощью веб-сервера go?

Как вы обслуживаете index.html(или какой-либо другой статический файл HTML) с помощью веб-сервера go?

Мне просто нужен базовый статический HTML файл (например, статья), который я могу обслуживать с веб-сервера go. HTML должен быть изменен вне программы go, как это было бы при использовании HTML-шаблонов.

Это мой веб-сервер, на котором размещается только жесткий текст ( "Hello world!" ).

package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello world!")
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":3000", nil)
}
4b9b3361

Ответ 1

Эта задача очень проста с помощью пакета Golang net/http.

Все, что вам нужно сделать, это:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir("./static")))
        http.ListenAndServe(":3000", nil)
}

предполагая, что статические файлы находятся в папке с именем static в корневой директории проекта.

Если он находится в папке static, вы получите index.html файл, вызывающий http://localhost:3000/, что приведет к рендерингу этого файла индекса, а не к тому, чтобы перечислять все доступные файлы.

Кроме того, вызов любого другого файла в этой папке (например, http://localhost:3000/clients.html) покажет этот файл, правильно отображаемый браузером (по крайней мере, Chrome, Firefox и Safari:))

ОБНОВЛЕНИЕ: подача файлов с URL-адреса, отличного от "/"

Если вы хотите обслуживать файлы, скажем, из папки ./public под url: localhost:3000/static Вы должны использовать дополнительную функцию: func StripPrefix(prefix string, h Handler) Handler следующим образом:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
        http.ListenAndServe(":3000", nil)
}

Благодаря этому все ваши файлы из ./public доступны в localhost:3000/static

Без функции http.StripPrefix, если вы попытаетесь получить доступ к файлу localhost:3000/static/test.html, сервер будет искать его в ./public/static/test.html

Это связано с тем, что сервер рассматривает весь URI как относительный путь к файлу.

К счастью, его легко решить с помощью встроенной функции.

Ответ 2

НЕ FTP-сервер: это нечто иное, чем я предполагал, что должно было бы обслуживать домашнюю страницу index.html, например, обычный веб-сервер. Например, когда я перехожу на mydomain.com в свой браузер, я хочу index.html rendered.

Это в основном то, что описывает Написание веб-приложений, и что такое проект, как hugo (статический html-сайт-генератор).

Речь идет о чтении файла и ответах с текстом ContentType "text/html":

func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    err := server.renderFile(w, r.URL.Path)
    if err != nil {
        w.Header().Set("Content-Type", "text/html; charset=utf-8")
        w.WriteHeader(http.StatusNotFound)
        server.fn404(w, r)
    }
}

с renderFile() по существу чтения и установки правильного типа:

 file, err = ioutil.ReadFile(server.MediaPath + filename)
 if ext != "" {
    w.Header().Set("Content-Type", mime.TypeByExtension(ext))
 }