Rails 4外部重定向和会话问题

时间:2015-09-09 10:39:11

标签: ruby-on-rails session redirect cookies

我正在尝试在Rails 4中构建一个网站来跟踪用户重定向和网站元素视图。

我决定使用会话ID,我认为这在短期内非常独特,但我有一个奇怪的问题。

示例程序:

  1. 用户遵循重定向,系统使用会话ID存储此操作,让我们说xxx
  2. 用户到达包含跟踪器的目标页面,系统使用另一个会话ID yyy
  3. 存储此操作
  4. 用户到达另一个也包含跟踪器的页面,系统会将此操作存储为会话ID yyy
  5. 存储第二个操作后,会话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
    

1 个答案:

答案 0 :(得分:1)

<强>更新

由于您使用iframe(下面的评论讨论)来跟踪代码,因此问题很可能是外部网站上的Cookie没有从父网页传递到iframe,因为iframe的起源(域)与父页面。

OLD ANSWER: (对于调试类似问题的其他人来说仍然有帮助)

源代码会有所帮助。没有它,这里有几件事要尝试:

  1. 尝试禁用CSRF保护以进行外部跟踪链接操作(我假设它来自外部源的POST或PUT数据)。 CSRF保护可以为这些请求创建新的或空的会话。将其放在包含接受来自外部源的数据的操作的控制器中:

    protect_from_forgery :except => [:your_action]
    
  2. 重定向(特别是如果它是301)可以在您正在使用的浏览器中缓存,因此与您的跟踪代码所做的请求具有不同的Cookie和会话。陈旧的cookie将成为缓存重定向的一部分。

    尝试将缓存控制标头放在执行重定向的控制器操作上。

    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    
  3. 您的浏览器可能不支持在重定向或第三方Cookie上设置Cookie。尝试使用其他现代浏览器?

  4. 您的代码中可能存在错误。如果这些解决方案不起作用,可以发布吗?