我试图在Rails 4中建立一个网站,以跟踪用户重定向和网站元素视图。
我决定使用会话id,我相信在短期内是相当独特的,但我有一个奇怪的问题。
示例程序:
- 用户遵循重定向,系统将此操作与会话ID一起存储,例如
xxx
- 用户到达目标页面,其中包含一个跟踪器,系统将此操作与另一个会话ID
yyy
保存, - 用户到达另一个包含跟踪器的页面,系统将此动作保存为会话ID
yyy
在存储第二个操作之后,会话ID在此之后的每个请求保持相同的yyy
,但我需要每次都具有相同的会话ID。
在会话中,我还存储了一个SecureRandom。hex生成的代码,从第一个请求到第二个请求也会改变(这并不奇怪,因为会话ID会改变)。
我也试过使用cookie,结果相同。
请注意,这些重定向是外部的,但所有的请求都是向相同的域(完全相同,没有www和https)。
任何想法?
提前感谢。
更新是负责管理重定向的源代码:
before_action :load_redirect, :only => [:http_redirect]
def http_redirect
raise ActionController::RoutingError.new('Redirect has been disabled') unless @redir.enabled
ua = UserAction.create(
:session_id => session.id,
:user_agent => request.user_agent,
:trackable => @redir,
:ip_address => request.remote_ip,
:referer => request.referer
)
redirect_to @redir.destination_url
end
private
def load_redirect
@redir = Redirect.find(params[:id])
end
UPDATE:
由于您正在使用iframe(按下面的评论讨论)跟踪代码,问题很可能是在外部站点cookie不被传递从父页到iframe,因为iframe的起源(域)是不同于父页。
老回答:(仍然可以帮助其他人调试类似的问题)
源代码会有帮助。如果没有,可以尝试以下几种方法:
-
尝试禁用CSRF保护用于外部跟踪链接动作(我假设它来自外部来源的POSTs或PUTs数据)。CSRF保护可以为这些请求创建一个新会话或空会话。将其放入包含从外部源接收数据的动作的控制器中:
protect_from_forgery :except => [:your_action]
-
重定向(特别是如果它是301)可以缓存在您正在使用的浏览器中,因此具有与您的跟踪代码请求不同的cookie和会话。过期的cookie将成为缓存重定向的一部分。
尝试将缓存控制头放在执行重定向的控制器操作上。
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = '0'
-
您的浏览器可能不支持在重定向上设置cookie,或者可能不支持第三方cookie。尝试使用不同的现代浏览器?
-
您的代码中可能有错误。如果这些解决方案不起作用,也许发布它?