2016-08-08 3 views
-2

Я видел этот пост кого-то здесь, но там нет ответов: Redirecting https://www.domain.com to https://domain.com in GoНельзя ли перенаправить из https: // www .. в https: // .. в Go?

Я пытался увидеть, если я мог бы найти способ, чтобы проверить, если запрос был сделан с помощью WWW URL путем проверки переменных в *http.Request переменных, но все Я получил относительные пути и пустые строки "".

Я попытался fmt.Println() эти переменные:

func handleFunc(w http.ResponseWriter, r *http.Request) { 
    fmt.Println(r.URL.string()) 
    fmt.Println(r.Host) 
    fmt.Println(r.RequestURI) 
} 

Но ни одна из этих переменных не содержит абсолютный путь с WWW части. Как я могу проверить, был ли запрос выполнен с URL-адреса www? Я хочу понять это, чтобы я мог перенаправить с www на non-www.

Действительно ли это невозможно в Go? Некоторые люди предложили поставить nginx перед Go, но должен ли быть способ без nginx правильно? Нужно ли мне действительно устанавливать и использовать nginx перед Go только для простого перенаправления с www на не-www? Это не похоже на хорошее решение, казалось бы, небольшой проблемы.

Нет ли способа достичь этого?

+0

Конечно, вы можете сделать это в Go, потому что Go это язык программирования общего назначения. Реальный вопрос заключается в том, можно ли это сделать в используемой вами библиотеке HTTP. Итак, какую библиотеку HTTP вы используете? Можете ли вы предоставить ссылку на свою документацию? Вы пробовали посмотреть HTTP-заголовок Host Host в запросе? –

+0

Поддомен 'www' не является частью пути, он будет частью поля хоста. Пожалуйста, покажите пример того, что вы видите, поскольку он должен присутствовать в 'Request.Host' или' Request.URL'. – JimB

ответ

2

Wrap обработчиков с редиректорами:

func wwwRedirect(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
    if host := strings.TrimPrefix(r.Host, "www."); host != r.Host { 
     // Request host has www. prefix. Redirect to host with www. trimmed. 
     u := *r.URL 
     u.Host = host 
     u.Scheme = "https" 
     http.Redirect(w, r, u.String(), http.StatusFound) 
     return 
    } 
    h.ServeHTTP(w, r) 
    }) 
} 

Используйте редиректор как это:

log.Fatal(http.ListenAndServeTLS(addr, certFile, keyFile, wwwRedirect(handler))