我正在尝试在Rails 4中构建一个网站来跟踪用户重定向和网站元素视图。
我决定使用会话ID,我认为这在短期内非常独特,但我有一个奇怪的问题。
示例程序:
xxx
yyy
yyy
存储第二个操作后,会话ID对于之后的每个请求保持不变yyy
,但我每次都需要具有相同的会话ID。
在会话I中还存储了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
答案 0 :(得分:1)
<强>更新强>
由于您使用iframe(下面的评论讨论)来跟踪代码,因此问题很可能是外部网站上的Cookie没有从父网页传递到iframe,因为iframe的起源(域)与父页面。
OLD ANSWER: (对于调试类似问题的其他人来说仍然有帮助)
源代码会有所帮助。没有它,这里有几件事要尝试:
尝试禁用CSRF保护以进行外部跟踪链接操作(我假设它来自外部源的POST或PUT数据)。 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。尝试使用其他现代浏览器?
您的代码中可能存在错误。如果这些解决方案不起作用,可以发布吗?