Как перенаправить с https://www.* на https: // * с golang библиотекой net / http - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь перенаправить все запросы на один и тот же URL с помощью библиотеки golang net / http.

В настоящее время работает:

Пока нет работает:

Оба URL возвращают одинаковый контент для всех запрошенных ресурсов , но это не имеет значения для файлов cookie сеанса.

Мой минимальный код:

    func listenAndHandle() {
        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
        http.HandleFunc("/", handle.PageIndex)

        go func() {
            if err := http.ListenAndServe(":80", http.HandlerFunc(redirectTLS)); err != nil {
                handle.Lv.Println("ListenAndServe error:", err)
            }
        }()

        handle.Lv.Println(http.ListenAndServeTLS(database.Config.PORT, database.Config.TLScertfile,
    database.Config.TLSkeyfile, nil))
    }

    func redirectTLS(w http.ResponseWriter, r *http.Request) {
        if strings.Contains(r.Host, "www.") {
            u := *r.URL
            u.Host = strings.Replace(r.Host, "www.", "", 1)
            u.Scheme = "https"
            http.Redirect(w, r, u.String(), http.StatusFound)
            return
        }
        http.Redirect(w, r, database.Config.TLSurl+r.RequestURI, http.StatusMovedPermanently)
    }

Меня не очень интересует добавление другой библиотеки для решения этой проблемы, все остальное работает просто хорошо с golang по умолчанию net / http.

1 Ответ

1 голос
/ 29 апреля 2020

Оберните обработчик TLS-сервера обработчиком, который либо перенаправляет на пустой домен, либо делегирует исходному обработчику.

Код в вопросе использует http.DefaultServeMux в качестве TLS-сервера обработчик. Вот функция обработчика, которая либо перенаправляет, либо вызывает через http.DefaultServeMux:

func redirectWWW(w http.ResponseWriter, r *http.Request) {
    if strings.HasPrefix(r.Host, "www.") {
        u := *r.URL
        u.Scheme = "https"
        u.Host = strings.TrimPrefix(r.Host, "www.")
        http.Redirect(w, r, u.String(), http.StatusFound)
        return
    }
    http.DefaultServeMux.ServeHTTP(w, r)
}

Используйте этот обработчик на сервере TLS:

    handle.Lv.Println(http.ListenAndServeTLS(database.Config.PORT, database.Config.TLScertfile,
database.Config.TLSkeyfile, http.HandlerFunc(redirectWWW)))
...