Ruby-on-Rails:如何摆脱“你被重定向”页面

时间:2010-11-30 05:51:25

标签: ruby-on-rails redirect devise http-status-codes http-status-code-401

我正在重写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

修改

或者我想显示flash消息并保留在同一页面上,但添加以下代码行:

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

导致红宝石抱怨:

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

这里发生了什么?

4 个答案:

答案 0 :(得分:31)

重定向的正确HTTP状态是30x格式(301和302是最常用的)。默认情况下,redirect_to帮助程序在HTTP响应上设置302状态标头。如果您覆盖它并将其设置为401,您的Web浏览器将假定响应是常规网页并将呈现响应正文 - 在重定向中,是样板文本“您正被重定向”。 / p>

答案 1 :(得分:1)

我实际上是在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

答案 2 :(得分:1)

@pantulis 所述,如果响应代码不是3xx,浏览器将显示此标准消息

要解决此问题,您可以执行javascript重定向:

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

只有在您确定所有用户都在使用javascript时,此选项才有效。如果您的应用程序可能已被禁用javascript的用户浏览,那么您还应该在标准中添加noscript标记和后备&#34;您正在被重定向&#34;消息

答案 3 :(得分:1)

当我遇到这个问题时,我过去所做的就是这样:

#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

我正在做的是检查页面内容是否是&#34;您正在&#34;。如果这是真的,我知道我不是我想成为的地方。我只是在Javascript的帮助下将页面更新到我真正想要的位置。 我知道它不是最优雅的解决方案,但确实有帮助

快乐黑客