如何在 rails 和 nginx secure_link 中使用 $remote_addr

How to use $remote_addr with rails and nginx secure_link

我有一个 rails 应用程序,它通过 net::http 调用另一台服务器来检索文档。

我已经用 secure_link 设置了 Nginx。

nginx 配置有

secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr mySecretCode";

在客户端(实际上是我的 rails 服务器),我必须创建安全的 url 类似于:

time = (Time.now + 5.minute).to_i
hmac = Digest::MD5.base64digest("#{time}/#{file_path}#{IP_ADDRESS} mySecretCode").tr("+/","-_").gsub("==",'')
return "#{DOCUMENT_BASE_URL}/#{file_path}?md5=#{hmac}&expires=#{time}"

我想知道的是获得上述值的最佳方法 IP_ADDRESS

SO 中有多个关于如何获取 ip 地址的答案,但其中很多似乎并不像实际向 Web 服务发出请求那样可靠 returns 请求的 ip 地址如此是 nginx secure link 会看到的(我们不需要某种本地主机地址)。

我将以下方法放在我的暂存服务器上:

  def get_client_ip
    data=Hash.new
    begin
      data[:ip_address]=request.ip
      data[:error]=nil
    rescue Exception =>ex
      data[:error]=ex.message
    end
    render :json=>data
  end

然后我从请求服务器调用了方法:

response = Net::HTTP.get_response(URI("myserver.com/web_service/get_client_ip"))
if response.class==Net::HTTPOK
  response_hash=JSON.parse response.body
  ip=response_hash["ip_address"] unless response_hash[:error]
else
  #deal with error
end

获取ip地址成功后只是缓存了下来,并没有继续调用web服务方法