27

我正在覆盖 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

4 回答 4

42

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

于 2010-11-30T06:32:10.433 回答
2

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

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

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

仅当您确定所有用户都在使用 javascript 时,这才有效。如果您的应用程序可以被可能禁用 javascript 的用户浏览,您还应该noscript在标准的“您正在被重定向”消息中包含一个标记和后备

于 2015-01-10T23:39:31.913 回答
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
于 2013-02-26T22:34:20.183 回答
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

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

快乐黑客

于 2017-06-03T15:57:08.703 回答