`

Rails获取用户访问的ip

 
阅读更多
在rails中获取rails的ip值的方法一般是用:
request.remote_ip

rails2,rails3都是这样调用,但是两者是有区别的
rails2.3.8中的这个方法封装在ActionController::Request类中
从源代码看
 def remote_ip
       remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/)
 
       unless remote_addr_list.blank?
         not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES}
         return not_trusted_addrs.first unless not_trusted_addrs.empty?
       end
       remote_ips = @env['HTTP_X_FORWARDED_FOR'] && @env['HTTP_X_FORWARDED_FOR'].split(',')
 
       if @env.include? 'HTTP_CLIENT_IP'
         if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP'])
           # We don't know which came from the proxy, and which from the user
           raise ActionControllerError.new("IP spoofing attack?!\nHTTP_CLIENT_IP=\#{@env['HTTP_CLIENT_IP'].inspect}\nHTTP_X_FORWARDED_FOR=\#{@env['HTTP_X_FORWARDED_FOR'].inspect}\n")
         end
 
         return @env['HTTP_CLIENT_IP']
       end
 
       if remote_ips
         while remote_ips.size > 1 && TRUSTED_PROXIES =~ remote_ips.last.strip
           remote_ips.pop
         end
 
         return remote_ips.last.strip
       end
 
       @env['REMOTE_ADDR']
     end

获取用户登录信息的http头都封装在了@env这个实例变量里面了

rails3.2.6对以前的代码作了优化,并单独封装了ActionDispatch::Request 这个类
源代码也只是剩下下面几行了
# File actionpack/lib/action_dispatch/http/request.rb, line 159
def remote_ip
  @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end


由于领导跟外面公司合作用了某某的加速服务(网站缓存到了其他地方的服务器上),造成ip获取产生了问题,服务商跟我说他们的真实ip放在了http头的 HTTP_X_REAL_FORWARDED_FOR中,于是打算重新给request写一个方法,获取用户的真实ip。

# 增加代理之后,ip发生了变化,需要取原始的ip地址
class ActionController::Request
  def real_ip
    !@env['HTTP_X_REAL_FORWARDED_FOR'].blank? ? @env['HTTP_X_REAL_FORWARDED_FOR'] : remote_ip
  end
end
分享到:
评论
2 楼 hotsunshine 2014-05-26  
vikki 写道
在rails 3.2.14中 request env 已经不是 HTTP_X_REAL_FORWARDED_FOR了,而是 HTTP_X_FORWARDED_FOR

而我们也只需要在application_controller.rb写一个方法即可

def real_ip(request)
    request.env['HTTP_X_FORWARDED_FOR'].present? ? request.env['HTTP_X_FORWARDED_FOR'] : request.remote_ip
  end


我这个比较早的版本
1 楼 vikki 2014-05-23  
在rails 3.2.14中 request env 已经不是 HTTP_X_REAL_FORWARDED_FOR了,而是 HTTP_X_FORWARDED_FOR

而我们也只需要在application_controller.rb写一个方法即可

def real_ip(request)
    request.env['HTTP_X_FORWARDED_FOR'].present? ? request.env['HTTP_X_FORWARDED_FOR'] : request.remote_ip
  end

相关推荐

    Webrick rails外部电脑访问慢

    **解释**:将`peeraddr`方法调用改为`peeraddr(:numeric)`可以避免进行反向DNS查询,从而直接获取客户端IP地址的数值表示形式,而不会试图解析成主机名。这样可以大大减少由于DNS查询导致的延迟。 ##### 第二处修改...

    Ruby-ImpressionistRails插件跟踪页面展示和浏览量

    它创建了一个`impressions`表来存储这些信息,包括但不限于访问时间、IP地址、用户代理(显示浏览器类型和版本)等。通过这些数据,开发者可以分析哪些页面最受欢迎,访问者的行为模式,以及可能的流量来源。 安装...

    Ruby-geoip搜索GeoIP数据库对于一个给定的主机或IP地址并返回IP地址分配的国家城市ISP和其他信息

    在Ruby开发中,如果需要获取用户的位置信息,或者根据用户的IP地址提供定制化服务,就可以使用这种GeoIP库。 在压缩包文件“geoip-master”中,我们可以期待找到该库的源代码和相关资源。通常,这样的命名表示这是...

    jpmobile:日本手机的Rails插件

    手机运营商识别终端位置信息的获取与获取终端序列号,承包商编号等IP地址验证(确定运营​​商发布的IP地址频段的访问权限) ip地址来验证IP地址。获取显示信息(屏幕尺​​寸,浏览器屏幕尺寸,彩色/黑白,颜色数量...

    Ruby-MailForm直接从Rails的表单发送电子邮件支持I18n验证附件和请求信息

    例如,你可以获取用户的IP地址或者他们通过哪个页面提交了表单。 总之,MailForm是Rails开发中的一个强大工具,它简化了邮件发送过程,同时提供了验证、I18n支持和附件功能,使你能够轻松构建高效且用户友好的电子...

    网络安全监控 Snorby.zip

    2. **事件分类与过滤**:通过对事件进行分类和过滤,用户可以根据严重性、源IP、目的IP等属性筛选信息,快速定位问题。 3. **高级搜索**:强大的搜索功能允许用户通过关键词、时间范围或特定字段进行复杂查询,便于...

    redmine-3.0.5.tar.gz For linux平台

    - 访问Redmine:在浏览器输入`http://your_server_ip:3000`,按照提示完成初始化设置。 4. 后期维护与升级: - 定期检查更新:Redmine会发布新版本,及时升级以获取新功能和安全更新。 - 数据备份:定期备份...

    geopweb:只是 geoplugin ruby​​ gem 的一个小演示

    本文将深入探讨如何在Ruby on Rails框架中使用geoplugin gem,这是一个强大的工具,能够帮助开发者轻松地获取用户的地理位置信息。我们将通过一个名为"geopweb"的示例项目,来了解这个gem的用法、工作原理以及如何在...

    redmine-2.6.7 For Linux版本

    - **安全配置**:为了防止未授权访问,需要对Redmine的配置文件进行安全优化,如设置SSL加密、限制IP访问等。 - **定期备份**:为防止数据丢失,定期备份数据库和重要文件。 - **升级维护**:关注Redmine的最新...

    GitLab安装-Ubuntu16.10

    注意:该链接可能已过期或不可用,请访问GitLab的官方网站获取最新的安装包。 ##### 安装GitLab 下载完成后,可以使用dpkg命令进行安装: ```bash sudo dpkg -i gitlab_7.0.0-omnibus-1_amd64.deb ``` ##### 设置...

    高负载网站架构

    11. **CDN(内容分发网络)**:用于快速分发静态资源,如图片、视频,通过分布在不同地理位置的节点,让用户从最近的服务器获取内容,提高访问速度。 在实际应用中,应根据网站的具体需求和资源情况,灵活选择和...

    GitLab安装与环境配置

    - 获取Linux系统的IP地址,可以通过`ifconfig`命令查看。 - 使用`ping`命令检查网络连通性,例如:`ping <IP地址>`。 - 安装并使用Xshell等工具进行SSH远程连接。 - 开启SSH服务:`service sshd start`。 - ...

    Laravel开发-geocode

    - 根据用户IP地址获取其大致地理位置,以实现本地化服务。 - 在地图上显示用户提交的地址,如在房产租赁或销售网站上。 总的来说,"Laravel开发-geocode"项目为Laravel 4用户提供了一种简单的方法,通过谷歌地理...

    主播电台管理后台.docx

    这可能是一个使用Java、Python、Node.js、Ruby on Rails等后端技术构建的Web服务。 2. **数据库管理**:主播电台的数据,如主播信息、直播记录、用户互动数据等,都需要存储在数据库中。常见的数据库选择有MySQL、...

    Distributed Ruby

    - **安全性**:DRb提供了基于IP地址的访问控制列表(ACL)的安全性支持。 #### 四、获取DRb DRb的核心类包含在Ruby的标准库中。完整的DRb包可以从官方网站下载: - [官方网站](http://www2a.biglobe.ne.jp/~seki/...

    Laravel开发-cvrapi

    在 Laravel 中创建 `cvrapi`,首先需要配置一个 API 接口的访问凭证,这通常包括 API 密钥、基础 URL 和可能的认证方式。接着,使用 Laravel 的 HTTP 客户端(`Guzzle`)或者自定义服务提供者来封装 API 请求。通过...

    ASP EXCEL导入SQL

     平台是多租赁用户的在线多应用来实现的,由于每个用户的具体业务需求不同,因此每个租赁用户的应用是相互隔离的,但应用层的结构却都是相同,从上到下主要分为业务展现层、业务逻辑层、业务模型层、实体访问层;...

    OWASP_Broken_Web_Application_Project.pdf

    在网络安全领域,传统的网络评估通常依赖于成熟稳定的TCP/IP协议,利用如Nmap、Vulnerability Manager和Metasploit等工具进行侦察、发现、指纹识别、枚举和利用等步骤,目标通常是获取shell权限,结果可预测且较为...

    8.2 gitlab安装和使用1

    你可以通过配置的域名访问GitLab Web界面,创建用户、项目,进行代码管理和团队协作。此外,定期运行`gitlab-ctl reconfigure`以保持GitLab配置的同步和更新。 总之,GitLab是一个强大且功能丰富的Git管理平台,...

Global site tag (gtag.js) - Google Analytics