Ruby-on-Rails: как избавиться от страницы «вы перенаправлены» - PullRequest
18 голосов
/ 30 ноября 2010

Я переопределяю реакцию на сбой Devise, чтобы установить код состояния 401. Однако, когда пользователь не может войти в систему, он перенаправляется на страницу со ссылкой «вы перенаправлены». Если я удаляю этот :status => 401 из перенаправления, он работает нормально.

class CustomFailure < Devise::FailureApp
    def redirect_url
      new_user_session_url(:subdomain => 'secure')
    end

    def respond
        if http_auth?
           http_auth
        else
           store_location!
           flash[:alert] = i18n_message unless flash[:notice]
           redirect_to redirect_url, :status => 401
        end
    end
end

редактировать

В качестве альтернативы я хотел бы отобразить флэш-сообщение и остаться на той же странице, но добавив следующую строку кода:

render :text => "unauthorized", :status => 401

заставляет рубина жаловаться:

undefined method `render' for #<CustomFailure:0x00000103367f28>

Что здесь происходит?

Ответы [ 4 ]

32 голосов
/ 30 ноября 2010

Правильные HTTP-статусы для перенаправления представлены в форме 30x (наиболее часто используются 301 и 302). По умолчанию помощник redirect_to устанавливает заголовок состояния 302 в ответе HTTP. Если вы переопределите это и установите его на 401, ваш веб-браузер будет считать, что ответ является обычной веб-страницей, и отобразит тело ответа - который в перенаправлении представляет собой стандартный текст «Вы перенаправлены».

1 голос
/ 03 июня 2017

Когда я сталкиваюсь с этой проблемой, то, что я делал в прошлом, выглядит примерно так:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  after_filter :check_page_content
  ...
  private
  def check_page_content
    if response.body.include? "You are being"
      html_doc = Nokogiri::HTML(response.body)
      uri = html_doc.css('a').map { |link| link['href'] }.first
      response.body = "<script>
                         window.location.replace('#{uri}');
                       </script>"
    end
  end
end

Что я делаю, так это проверяю, является ли содержимое страницы "Вы находитесь".если это правда, я знаю, что я не там, где я хочу быть.и я просто обновляю страницу, где я действительно хочу быть с некоторой помощью Javascript.Я знаю, что это не самое элегантное решение, но оно действительно помогает

Счастливого взлома

1 голос
/ 11 января 2015

Как сказал @ pantulis , браузер отобразит это стандартное сообщение, если код ответа не 3xx

Чтобы обойти это, вы можете выполнить перенаправление JavaScript:

# example with status 500:
render text: "<script>window.location = '#{url}';</script>", status: 500

Это вне курса действительно, только если вы уверены, что все ваши пользователи используют javascript. Если ваше приложение могут просматривать пользователи, которые могут отключить JavaScript, вы должны также включить тег noscript и отступление в стандартное сообщение «Вы перенаправлены»

1 голос
/ 27 февраля 2013

Я действительно сталкивался с этой проблемой на нашем сервере QA, но не локально. Оказалось, что наш memcache перехватывает сообщение и отображает его как 200, и это сообщение появляется. Это было косвенно связано с нашими настройками memcache, которые не ожидали перенаправления с GET.

From: 
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @memcached

To:
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @rails
...