从 http.Request 获取客户端 IP 地址的正确方法

2023-12-15

获取所有客户端 IP 地址的正确方法是什么http.Request? In PHP有很多的变量我应该检查一下。 Go 上也一样吗?

我发现的一项是:

req.RemoteAddr

请求是否区分大小写?例如x-forwarded-for是相同的X-Forwarded-For and X-FORWARDED-FOR? (from req.Header.Get("X-FORWARDED-FOR"))


看着http.请求你可以找到以下成员变量:

// HTTP defines that header names are case-insensitive.
// The request parser implements this by canonicalizing the
// name, making the first character and any characters
// following a hyphen uppercase and the rest lowercase.
//
// For client requests certain headers are automatically
// added and may override values in Header.
//
// See the documentation for the Request.Write method.
Header Header

// RemoteAddr allows HTTP servers and other software to record
// the network address that sent the request, usually for
// logging. This field is not filled in by ReadRequest and
// has no defined format. The HTTP server in this package
// sets RemoteAddr to an "IP:port" address before invoking a
// handler.
// This field is ignored by the HTTP client.
RemoteAddr string

您可以使用RemoteAddr获取远程客户端的IP地址和端口(格式为“IP:port”),即原始请求者的地址或最后一个代理(例如位于服务器前面的负载均衡器)。

这就是你所拥有的一切。

然后你可以调查标题,它们是不区分大小写(根据上面的文档),这意味着您的所有示例都将起作用并产生相同的结果:

req.Header.Get("X-Forwarded-For") // capitalisation
req.Header.Get("x-forwarded-for") // doesn't
req.Header.Get("X-FORWARDED-FOR") // matter

这是因为内部http.Header.Get将为您标准化密钥。 (如果你想直接访问头映射,而不是通过Get,你需要使用http.CanonicalHeaderKey first.)

最后,"X-Forwarded-For"可能是您想要查看的字段,以便获取有关客户端 IP 的更多信息。这在很大程度上取决于远程端使用的 HTTP 软件,因为客户端可以根据需要在其中放置任何内容。另外,请注意expected format该字段是逗号+空格分隔的 IP 地址列表。您需要稍微解析它以获得您选择的单个 IP(可能是列表中的第一个),例如:

// Assuming format is as expected
ips := strings.Split("10.0.0.1, 10.0.0.2, 10.0.0.3", ", ")
for _, ip := range ips {
    fmt.Println(ip)
}

将产生:

10.0.0.1
10.0.0.2
10.0.0.3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 http.Request 获取客户端 IP 地址的正确方法 的相关文章

  • Golang:如何在HTTP客户端的TLS配置中指定证书

    我有一个证书文件 该位置是 usr abc my crt我想将该证书用于我的 tls 配置 以便我的 http 客户端在与其他服务器通信时使用该证书 我当前的代码如下 mTLSConfig tls Config CipherSuites u
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • HTTPbis - bis 是什么意思?

    我经常看到 bis 附加到协议版本 例如 v 34bis 或 httpbis bis 是什么意思或代表什么 我认识的一位电信工程师认为它可能起源于法国 正如其他人已经说过的 bis 来自 两次 或 重复 http oxforddiction
  • 如何在GO中执行HEAD请求?

    我想使用 GO net http 获取页面的内容长度 我可以在终端中使用curl i X HEAD https golang org然后检查内容长度字段 use http Head https golang org pkg net http
  • 如何在Google AppEngine上设置环境变量?

    我正在尝试在谷歌应用程序引擎上设置和使用环境变量 我的 app yaml 文件如下所示 但是 当我使用 os Getenv mytoken 时 我得到一个空字符串 而不是我设置的实际值 是GAE的bug吗 api version go1 h
  • 我使用go语言打印到POS打印机,但打印出的中文字符很糟糕。 (英语没问题)

    我在用着this https github com alexbrainman printer去打包 一切都很好 但汉字打印得很差 我不擅长这种低级 硬件 编码的事情 所以有人提示我如何纠正我的代码 更新代码 func main testWi
  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u
  • 为什么 Go 中不允许在包级别声明短变量?

    这是允许的 package main var a 3 但这不是 package main a 3 为什么不 为什么不能将函数外部的短变量声明视为没有类型的常规声明 只是为了简化解析 根据伊恩 兰斯 泰勒的说法这个线程 https group
  • Golang:从文本文件中替换字符串中的换行符时出现问题

    我一直在尝试读取一个文件 然后将读取的材料放入字符串中 然后字符串将按行分割成多个字符串 absPath filepath Abs Go input txt data err ioutil ReadFile absPath if err n
  • Go 中的数据竞争:为什么会在 10-11 毫秒以下发生?

    这是我运行的代码 package main import fmt time const delay 9 time Millisecond func main n 0 go func time Sleep delay n fmt Printl
  • 使用 Django 发出 HTTP 请求并反序列化输出

    因此 我对整个 Web 开发几乎完全陌生 但已经投入到一个使用 Django 从 Web 服务中提取和解析数据的副项目中 并且即使在查看 Django 时 我也很难准确地理解事情是如何工作的 文档 在 Django 中 我已经完成了所有设置
  • 无法在 Golang 中导入本地模块

    我正在尝试导入本地模块 但无法使用以下命令导入它go mod 我最初使用以下方式构建了我的项目go mod init github com AP Ch2 GOMS 注意我的环境是go1 14我使用 VSCode 作为我的编辑器 这是我的文件
  • bash脚本ip主机

    在第一个中 如果我们希望显示主机名 这是文件中的第五个字段 然后 如果我们提供给主机命令的 IP 不存在 则该命令将返回消息 3 NXDOMAIN 脚本应该识别命令是否 未找到 在这种情况下 它将 必须简单地打印 bin bash ip 1
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • Golang:使用像 Node.js 中那样的可读流从 PostgreSQL 数据库中选择几百万行

    我有大约 5000 万行的 PostgreSQL 表 我想编写 Go 代码来从该表中选择大约 100 万行 并以有效的方式处理它们 上次我使用了nodejs和这个NPM模块pg 查询流 https www npmjs com package
  • GO中的优先级队列

    谁能向我解释一下 我想在GO中实现一个优先级队列 接口实现来自link https golang org pkg container heap example priorityQueue 但优先级最低 我的代码 pq make Priori
  • URL 哈希在重定向之间持续存在

    由于某种原因 当发送服务器端重定向 使用 Location 标头 时 非 IE 浏览器似乎会保留 URL 哈希 如果存在 例子 a simple redirect using Response Redirect http www yahoo
  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 志愿者匹配 API Objective C

    我正在使用 AFNetworking 对 VolunteerMatch API 执行 Web 请求 当我执行请求时 我收到 200 代码 但没有收到响应 典型的 VolunteerMatch 请求如下所示 GET api call acti
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt

随机推荐

  • 如何检查 css box-shadow 是否受支持(jQuery)?

    我正在创建一个完整的 css 布局 但是 某些浏览器 例如IE6 不支持box shadow 和 webkit box shadow或 moz box shadow 我想检查一下是否不支持 然后添加其他样式 这在 jQuery 中怎么可能呢
  • 在 Heroku 上结合使用 Resque、Puma 和 Scheduler

    在查看了大量指南后 我想确认我的设置 现在我的procfile好像 web bundle exec puma C config puma rb config ru resque TERM CHILD 1 RESQUE TERM TIMEOU
  • 如何恢复用 jQuery 删除的元素?

    如果使用删除元素 notification remove 我们如何将其创建回来 你无法得到那个特定的例子后退 使用 remove 将其从 DOM 中删除 不过 您可以创建它的克隆 在 DOM 中移动它 隐藏它等等 根据您的项目需求 您可能还
  • 读取行时,awk $line

    我有一个包含数字列表的文件 我有第二个文件 每个文件包含各种条目和多个字段 我想要做的是获取第 12 个字段等于第一个数字的所有行 并将它们放入一个新文件中 然后放入第二个数字 依此类推 我写了一句很有道理的俏皮话 但我不明白为什么它行不通
  • Spring 4 静态内容(如 css/js)带来错误 405 不支持请求方法“GET”

    我已经检查过这个问题 但是经过 4 个小时的尝试 没有任何结果对我有用 尝试访问我的 css 文件时收到 405 错误 这是我的 Config java package com myapp config import org springf
  • 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

    目前 每当我这样做时make我的 makefile 告诉我 make some obj file o 是最新的 无论我是否编辑了生成该目标文件所涉及的任何文件 我如何让它检测变化 这是一个重现该问题的简单 makefile SHELL bi
  • C# 中的二维数组切片

    我正在寻找在 C 中切片二维数组 我有 double 2 2 价格 想要检索该数组的第二行 我尝试过价格 1 但我有一种感觉 可能是别的东西 提前致谢 没有直接的 切片 操作 但您可以定义如下扩展方法 public static IEnum
  • 扫描仪扫描文档(TIFF 和 PDF)的最佳设置[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 扫描仪的最佳设置是什么 以便扫描文档 白色和黑色文本 并将其用于 OCR 转换 以获得最佳结果 以及 PDF 和 TIFF 格式的标准设置和规范是什么 对于 OCR 最佳扫描设置是
  • Symfony2:未设置记住我令牌

    我按照需要做了一切 但我的 记住我 标记尚未设置 我跟踪代码直到 vendor symfony src Symfony Component Security Http RememberMe TokenBasedRememberMeServi
  • R 中的 ezANOVA 和pairwise.t.test:输出

    我一直在使用 R 运行 ezANOVA 然后进行成对比较 pairwise t test 运行后似乎不包含输出 所以我有以下与此相关的问题 是否有可能在 ezANOVA 中生成均方误差以进行重复测量 如果可以 如何生成 以及如何在pairw
  • 如何设置DataGrid中选定行的颜色

    DataGrid 中选定行的默认背景颜色太暗 我无法读取它 有没有办法覆盖它 试过这个
  • 在文件夹 blog 的同一域中安装 Wordpress 和 Laravel

    我在同一个domain com 上安装了laravel 该网站已启动并运行 我需要在domain com blog 的博客文件夹中安装wordpress 当我尝试安装 WordPress 时 它不允许我运行安装并显示 此网页有重定向循环 我
  • 带引号的注册表值

    我需要将一个值插入批处理文件中的注册表中 该值包含引号 这使得插入变得困难 set OPENCOMMAND JAVAHOME bin javaw exe jar 1 reg add HKEY LOCAL MACHINE SOFTWARE C
  • 如何对未知属性的数据进行建模?

    对需要查询但无法预先完全定义的数据进行建模的好方法是什么 例如 假设我想对有关以下内容的信息进行建模世界各国 每个国家都有一个人口 a flag和一个列表语言 这很容易 但是假设我们还想建模他们的国家棒球队的胜 负记录当然 并非所有国家都有
  • 使用列级标题过滤 Slickgrid 时如何执行部分匹配?

    当使用固定标题行实现列级过滤器时 如何返回部分匹配的单元格 IE 搜索词 omato 退货 自动机 番茄等 在示例中的 MyFilter 下替换此循环 for var columnId in columnFilters if columnI
  • 如何使用该目录的文件描述符在内核级别打开该目录?

    我正在开发一个项目 我必须打开一个目录并在内核级别读取其中的文件 目录 我基本上想找出如何ls是在内核级别实现的 现在我已经弄清楚如何使用以下命令获取目录的文件描述符sys open 和O DIRECTORY flag 但我不知道如何读取收
  • 在运行时用 Java 创建 n 维数组

    我有一个包含数组的字符串 例子 1 2 4 5 7 8 现在 我想用它制作一个实际的 Java 数组 我创建了一个函数来获取维度 并创建了一个递归函数来获取数组的每个元素 因此 我创建了每个一维数组 但我想知道Java中是否有一种方法可以创
  • 如何从子级向父级引用一个类?

    这可能听起来很愚蠢 但我如何在父级的另一个脚本中引用子级中的一个脚本中的类 我在谷歌上找不到任何东西 注意 我的脚本中有几个错误 这不是本文的重点 Public Private private Rigidbody myRigidbody p
  • android webview 中的 onClick 事件太慢

    我感觉 javascript 本身在 android webview 中相当快 但是触摸元素和触发 onclick 事件之间有很长的延迟 我可以想象 如果您在页面之间导航 这是一个功能 您首先看到元素上的突出显示 然后看到效果 导航 但对于
  • 从 http.Request 获取客户端 IP 地址的正确方法

    获取所有客户端 IP 地址的正确方法是什么http Request In PHP有很多的变量我应该检查一下 Go 上也一样吗 我发现的一项是 req RemoteAddr 请求是否区分大小写 例如x forwarded for是相同的X F