@recloudor

Go. Почему перенаправляет на «/»?

Если по запросу на определенный url, приходит ответ редиректа, то этот редирект теперь всегда будет возвращаться по обращению к этому url.
Даже если перезапустить программу ничего не изменится.
До хендлера вообще не доходит дело.
Ответ редиректом привязан к текущей сессии браузера.
В новом окне инкогнито этот url будет работать, пока не заредеректит.

Middleware нет, gin, но и без него такая-же шняга.

Если я изменяю определенную куку, то опять можно заходить.

В чем может быть проблема?
  • Вопрос задан
  • 655 просмотров
Решения вопроса 1
@mantyr
Пишу много Golang кода с удовольствием:)
https://ru.wikipedia.org/wiki/Список_кодов_состоян...

  • 301 Moved Permanently — запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка. Некоторые клиенты некорректно ведут себя при обработке данного кода. Появился в HTTP/1.0.
  • 302 Found, 302 Moved Temporarily — запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location. Этот код может быть использован, например, при управляемом сервером согласовании содержимого. Некоторые клиенты некорректно ведут себя при обработке данного кода. Введено в HTTP/1.0.
  • 303 See Other — документ по запрошенному URI нужно запросить по адресу в поле Location заголовка с использованием метода GET несмотря даже на то, что первый запрашивался иным методом. Этот код был введён вместе с 307-ым для избежания неоднозначности, чтобы сервер был уверен, что следующий ресурс будет запрошен методом GET. Например, на веб-странице есть поле ввода текста для быстрого перехода и поиска. После ввода данных браузер делает запрос методом POST, включая в тело сообщения введённый текст. Если обнаружен документ с введённым названием, то сервер отвечает кодом 303, указав в заголовке Location его постоянный адрес. Тогда браузер гарантировано его запросит методом GET для получения содержимого. В противном случае сервер просто вернёт клиенту страницу с результатами поиска. Введено в HTTP/1.1.
  • 304 Not Modified — сервер возвращает такой код, если клиент запросил документ методом GET, использовал заголовок If-Modified-Since или If-None-Match и документ не изменился с указанного момента. При этом сообщение сервера не должно содержать тела. Появился в HTTP/1.0.
  • 305 Use Proxy — запрос к запрашиваемому ресурсу должен осуществляться через прокси-сервер, URI которого указан в поле Location заголовка. Данный код ответа могут использовать только исходные HTTP-сервера (не прокси). Введено в HTTP/1.1.
  • 306 (зарезервировано) — использовавшийся раньше код ответа, в настоящий момент зарезервирован. Упомянут в RFC 2616 (обновление HTTP/1.1).
  • 307 Temporary Redirect — запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка. Метод запроса (GET/POST) менять не разрешается. Например, POST запрос должен быть отправлен по новому URI тем же методом POST. Этот код был введён вместе с 303 вместо 302-го для избежания неоднозначности. Введено в RFC 2616 (обновление HTTP/1.1).


Если в крадце, то разница лишь в нюансах.
  • 303 сделает временный редирект и уберёт POST запрос заменив его на GET
  • 307 сделает POST запрос на новый адрес если изначально был именно POST


Для себя сделал вот так:
package tmpl

import (
    "net/http"
)

func Redirect(w http.ResponseWriter, address string) {
    if address == "" {
        address = "/"
    }
    w.Header().Set("Location", address)
    w.Header().Set("Cache-Control", "private, no-store, max-age=0, must-revalidate")
    w.WriteHeader(303)                                                                      // see https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP#303
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Это зависит от того, какой вы код редиректа используете.
301 Moved Permanently - это постоянное перенаправление, браузер его закэширует и будет постоянно использовать, судя по всему, вы используете именно его.
302 Found - это временное перенаправление для одноразовых редиректов. Попробуйте использовать его.
Ответ написан
Комментировать
geebv
@geebv
Для более полного понимания вопроса, приведите, пожалуйста, код вашей программы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы