gpt4 book ai didi

ruby-on-rails - 有没有办法在 Rails Web 应用程序中获取客户端的实际端口?

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:32 25 4
gpt4 key购买 nike

我想在 Rails Web 应用程序中获取客户端的实际端口号(路由器提供给客户端计算机的端口)。

这可能吗?

最佳答案

至少在 Rails 5.2+ 中,request.env["REMOTE_PORT"] 是空白的,所以我否决了另一个答案。

经过一番挖掘,我设法获取此信息的方法是在 nginx 中设置自定义 header 。

你的 nginx 配置中可能有这样的东西:


upstream {{ param_app_name }} {
server unix:///var/www/{{ param_app_name }}/shared/tmp/sockets/puma-{{ param_app_name }}.sock;
}

...


location / {
try_files $uri @app;
}

location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Client-Request-Port $remote_port; # << -- Add this to your nginx conf
proxy_redirect off;
proxy_pass http://{{ param_app_name }};
}

如您所见,您可以在使用 proxy_pass 调用后端的同一服务器 block 中使用 proxy_set_header 将自定义 header 从 nginx 传递到 Rails 后端。

header 名称 X-Client-Request-Port 是任意的,您可以选择任何您喜欢的,但是有一个旧的约定使用 X-...自定义 header 。

设置并重新加载 nginx 后,您只需使用 request.headers["X-Client-Request-Port"] 即可在 Rails 中访问此值。

顺便说一句,我假设您是出于记录目的而询问这个。如果是这种情况,我建议您看一下 Lograge gem,它将使您的日志条目仅在每个请求中显示一行,从而减少 Rails 默认记录器在生产中的困惑情况。我按照 Ankane 的指南进行了这样的配置 here :

In ApplicationController:

def append_info_to_payload(payload)
super

payload[:remote_ip] = request.remote_ip
payload[:remote_port] = request.headers["X-Client-Request-Port"]
payload[:user_id] = current_user.id if current_user
# You can add more custom stuff here, just whitelist it in production.rb below.
end

Then, in config/environments/production.rb:

config.lograge.enabled = true

config.lograge.custom_options = lambda do |event|
options = event.payload.slice(
:request_id,
:user_id,
:remote_ip,
:remote_port,
)
options[:params] = event.payload[:params].except("controller", "action")
options
end

关于ruby-on-rails - 有没有办法在 Rails Web 应用程序中获取客户端的实际端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16783123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com