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 => :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:多个 has_many :通过可能吗?