ruby-on-rails - 构建获取 IP 的中间件

标签 ruby-on-rails ruby-on-rails-3 heroku rack middleware

我正在尝试编写我的第一个 Rack 中间件。并且需要帮助。我想要找到请求者 IP 的中间件,如果它在允许的 IP 列表中,则继续请求,否则中止。

棘手的部分是我需要它在你不能使用 request.ip 的 heroku 上工作:http://developerhemal.tumblr.com/post/3958107290/client-ip-addresses-on-heroku

所以我有以下内容:

class RestrictIP
  def initialize(app, message = "Hello")
    @app = app
    @message = message
  end

  def call(env)
    dup._call(env)
    @ip = env['HTTP_X_REAL_IP'] ||= env['REMOTE_ADDR']
  end

  def each(&block)
    block.call("<!-- #{@ip} -->\n")
    @response.each(&block)
  end
end

此错误:

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]=):

对于我的第一次迭代,我只是想确保我可以获取请求者的 IP 并将其放在 html 文档中。

那里有 Rack 中间件专家吗?谢谢

最佳答案

根据 this post ,看来您可以使用以下内容:

ip = env[‘HTTP_X_REAL_IP’] ||= env[‘REMOTE_ADDR’]

我没有测试过这个,因为我不在 Heroku 上。

关于ruby-on-rails - 构建获取 IP 的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112604/

相关文章:

ruby-on-rails - Rails - Presenter 中的 Helper Singleton 和 Rails Route Helpers

heroku - 在 Heroku 上的 Play 框架中处理文件上传

javascript - DOM 元素属性未定义 - jquery/ruby on Rails

ruby-on-rails - "first"在 Ruby 和 Rails 中有什么作用?

ruby-on-rails - 在服务器上安装 Rails 应用程序

ruby-on-rails - 在迁移 PostgreSQL 上设置主键值 0 并自动递增

ruby-on-rails - 如何急切加载与 current_user 的关联?

java - 在 Java Play 应用程序上通过 SendGrid 发送邮件失败

ruby-on-rails - 我的单线程 Rails 应用程序如何处理并发请求?

ruby-on-rails - 如何在 ActiveAdmin 中添加按钮来为另一个资源创建新记录,并使用当前资源中的值预先填充字段?