Ruby on Rails - request.env ['HTTP_REFERER'] возвращает ноль - PullRequest
6 голосов
/ 23 июня 2010

Я пытаюсь сохранить http_referer, чтобы я мог отправить пользователя обратно на этот URL после того, как он вошел в систему. Прямо сейчас у меня в контроллерах before_filter, который отправляет их на страницу входа, если сеанс не был создан через redirect_to. Однако когда я проверяю HTTP_REFERER, он равен nil (тогда как REQUEST_URI возвращает то, откуда я изначально пришел).

Спасибо.

Ответы [ 2 ]

12 голосов
/ 23 июня 2010

HTTP_REFERER - это HTTP-заголовок, установленный браузером в запросе, который содержит адрес предыдущей веб-страницы, с которой следовала ссылка на текущую запрашиваемую страницу. не будет установлено при прямой навигации по странице.

REQUEST_URI (также доступен через request.request_uri()) - это унифицированный идентификатор ресурса, используемый для доступа к контроллеру / действию Rails, и всегда должен быть установлен .

Добавьте этот код отладки в ваше представление:

<ul>
<% request.env.each do |item| %>
    <li><%= item[0] %> : <%= item[1] %></li>
<% end %>
</ul>

Если HTTP_REFERER не установлен, убедитесь, что вы переходите на эту страницу по ссылке или перенаправлению, и посмотрите, установлен ли он тогда.

Существует также вероятность того, что ваш браузер не установил заголовок HTTP_REFERER. Убедитесь, что у вас нет надстройки, влияющей на это. Вы можете использовать изящное дополнение Firefox под названием Tamper Data , чтобы увидеть отправляемые заголовки.

6 голосов
/ 24 июня 2010

Независимо от того, какое решение вы придумали, вы должны иметь возможность обрабатывать пустой случай реферера, потому что у клиента есть выбор, указывать его или нет. (Выключено, например, когда вы находитесь в режиме приватного просмотра Safari и в режиме инкогнито Chrome)

В Rails вы можете использовать redirect_to :back, который будет использовать HTTP_REFERER, если он установлен, или вызвать ошибку в противном случае.

При использовании redirect_to: back, если реферера нет, RedirectBackError будет вызван. Для этого случая вы можете указать какое-либо резервное поведение, спасая RedirectBackError.

...