【发布时间】:2010-06-23 19:10:26
【问题描述】:
我正在尝试保存 http_referer,以便在用户登录后将其发送回该 url。现在我的控制器中有一个 before_filter,如果尚未创建会话,则将它们发送到登录页面通过redirect_to。但是,当我检查 HTTP_REFERER 时,它是 nil(而 'REQUEST_URI' 确实返回了我最初来自的地方)。
谢谢。
【问题讨论】:
我正在尝试保存 http_referer,以便在用户登录后将其发送回该 url。现在我的控制器中有一个 before_filter,如果尚未创建会话,则将它们发送到登录页面通过redirect_to。但是,当我检查 HTTP_REFERER 时,它是 nil(而 'REQUEST_URI' 确实返回了我最初来自的地方)。
谢谢。
【问题讨论】:
HTTP_REFERER 是浏览器在请求中设置的 HTTP 标头,其中包含上一个网页的地址,从该网页链接到当前请求的页面。直接导航到页面时将不设置。
REQUEST_URI(也可通过request.request_uri() 获得)是用于访问 Rails 控制器/动作的统一资源标识符,应该始终设置。
将此调试代码放入您的视图中:
<ul>
<% request.env.each do |item| %>
<li><%= item[0] %> : <%= item[1] %></li>
<% end %>
</ul>
如果未设置 HTTP_REFERER,请确保您通过链接或重定向导航到该页面,然后查看是否已设置。
您的浏览器也有可能是not setting HTTP_REFERER 标头。确保您没有影响这一点的附加组件。您可以使用名为 Tamper Data 的漂亮 Firefox 插件来查看正在发送的标头。
【讨论】:
无论你想出什么解决方案,你都需要能够处理空的referer case,因为客户可以选择是否指定它。 (例如,当您处于 Safari 的隐私浏览和 Chrome 的隐身模式时,它会关闭)
在 Rails 中,您可以使用redirect_to :back,如果设置了 HTTP_REFERER,它将使用它,否则会引发错误。
使用redirect_to :back 时,如果没有referrer,则会引发RedirectBackError。您可以通过抢救 RedirectBackError 为这种情况指定一些回退行为。
【讨论】: