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

Posted

技术标签:

【中文标题】Ruby-on-Rails:如何摆脱“你被重定向”页面【英文标题】:Ruby-on-Rails: How to get rid of "you are being redirected" page 【发布时间】:2011-05-17 16:34:24 【问题描述】:

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

让 ruby​​ 抱怨:

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

这里发生了什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

好的,我该如何提供 401 和重定向,还是不可能? 我认为这是不可能的,至少以可移植的方式适用于不同的浏览器。通过在响应中设置 40x 状态而不是 30x,您可以有效地将重定向转换为不同的东西。 谢谢我对redirect_to root_url, :status =&gt; :unauthorized 也有同样的尝试。我不得不删除 :status 选项。【参考方案2】:

我实际上是在我们的 QA 服务器上遇到了这个问题,但不是在本地。原来,我们的 memcache 正在拦截该消息并将其呈现为 200,并导致该消息出现。这是由于我们的内存缓存设置间接导致的,该设置并不期望来自 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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

#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 的帮助下将页面更新到我真正想要的位置。 我知道这不是最优雅的解决方案,但它确实有帮助

快乐的黑客

【讨论】:

以上是关于Ruby-on-Rails:如何摆脱“你被重定向”页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby-on-Rails 中生成 PDF 表单

ruby-on-rails - 嵌套资源问题

Ruby-on-Rails:多个 has_many :通过可能吗?

ubuntu中ruby-on-rails的安装

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

让 Ruby-on-Rails 6/Webpack + Bootstrap 一起正常工作的问题