我有Rails 2.3.8,Ruby 1.8.7,Mongrel Web Server和MySQL数据库.
我处于开发模式,我需要找到真正的IP地址
当我使用时,request.remote_ip我正在获取IP127.0.0.1
我知道我得到了127.0.0.1因为我在本地机器上开发..但即使我在本地机器上,有没有办法获得真正的IP地址?
我在我的控制器中使用下面提到的这些,我得到的就是127.0.0.1视图中的所有这些.
request.remote_ip
request.env["HTTP_X_FORWARDED_FOR"]
request.remote_addr
request.env['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud) 我需要将访问者的IP地址存储到我们的数据库中,这是我尝试这样做的方式:
@ip = request.remote_ip
@ip = request.env['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,即使我将应用程序部署到Amazon EC2实例,该@ip变量也存储了值127.0.0.1.
当我检查http://www.whatismyip.com/,它表明我的IP为109.175.XXX.X.
那么,为什么ruby变量总是显示127.0.0.1地址?我如何获得真正的IP?
编辑: 这是以下输出:
request.env['HTTP_X_FORWARDED_FOR'] =>
request.remote_ip => 127.0.0.1
request.env['REMOTE_ADDR'] => 127.0.0.1
request.ip => 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我认为问题就在我身边,但我发送了3个朋友的链接,所有人都看到了相同的IP,只有127.0.0.1.
我整天都在解决这个问题但仍然没有成功.
谢谢
我检查控制器中的ip-address
request.env['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)
这在我的测试环境中工作正常.但是在使用nginx + unicorn的生产服务器上,我总能得到127.0.0.1.
这是我的网站的nginx配置:
upstream unicorn {
server unix:/tmp/unicorn.urlshorter.sock fail_timeout=0;
}
server {
listen 80 default deferred;
# server_name example.com;
root /home/deployer/apps/urlshorter/current/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
Run Code Online (Sandbox Code Playgroud) 我在Google Container Engine上运行Ruby on Rails应用程序(在Nginx模式下使用Passenger).这些pod位于GCE网络负载平衡器后面.我的问题是如何Client IP从Rails应用程序内部访问外部.
这里的Github问题似乎提出了一个解决方案,但我运行了建议:
for node in $(kubectl get nodes -o name | cut -f2 -d/); do
kubectl annotate node $node \
net.beta.kubernetes.io/proxy-mode=iptables;
gcloud compute ssh --zone=us-central1-b $node \
--command="sudo /etc/init.d/kube-proxy restart";
done
Run Code Online (Sandbox Code Playgroud)
但我仍然得到一个REMOTE_ADDR标题10.140.0.1.
关于如何访问真实的想法Client IP(用于地理位置)?
编辑:为了更清楚,我所知道的,从里面Rails的访问客户端IP的方式,但所有这些解决方案都让我内部Kubernetes IP,我相信GCE网络负载平衡器未配置(或者不能)发送真实的客户端IP.
我在我的控制器中有一个函数,它调用另一个函数来形成需要输入ip地址的模型
def get_location_users
if current_user
return current_user.location_users
else
l = Location.find_by_ip(request.remote_ip)
lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
return [lu]
end
end
Run Code Online (Sandbox Code Playgroud)
从我收集的remote.request_ip给你的IP地址,但是当我用request.remote_ip调用该函数时,对象是零.如果我输入静态IP地址虽然它产生正确的输出.如果remote.request_ip不这样做,获取IP地址的正确方法是什么?
当我尝试在控制台中输入"request.remote_ip"时,它会从主"返回"未定义的局部变量或方法"请求"
我和Sinatra一起使用红宝石.我想获取访问者的公共IP并将其保存在数据库中,但不知道如何获取IP ...抱歉,但我还没有找到办法做到这一点.伙计们可以帮帮我吗?谢谢!