给定目标URI,如何以编程方式确定该URI的HTTP GET是否会向本地计算机发出请求?如何以编程方式确定URI,主机名或IP地址是否属于本地主机?
上下文:我需要这样做有两个原因。一个是我有一个mod_perl2应用程序来响应HTTP请求。这样做时,它有时需要发出HTTP请求来从目标URI检索一些数据。为了避免HTTP请求的无限递归,如果目标URI实际上会解析到当前机器,我需要避免发出HTTP请求。这是为了防止用户意外地在脚下自己拍摄。它不是作为安全检查。
第二个原因是,如果我的应用程序收到一个HTTP请求,我需要使用请求URI作为关键字来查找一些元数据。问题是任何一个URI同义词都可能被用作创建元数据的关键字,所以我需要一种方法来解析同义词,但仅限于本地主机上的URI。
问题不像看URI那样简单,看域名是“本地主机”,还是其IP地址是127.0.0.1(或127.0.1.1或127. *),因为:(a)目标URI可能使用解析为当前机器上IP地址的完全限定域名(例如,foo.example.com);和(b)一台机器可以有多个IP地址。
操作系统必须有有必要的信息来弄清楚,因为它必须知道它侦听的IP地址和端口。 This post讨论试图确定本地计算机的IP地址(或地址,因为它可能有几个)的问题。也许我可以这样做来确定本地计算机的IP地址,然后或许我可以将这些IP地址与目标URI中的IP地址(或由URI的域的gethostbyname返回的IP地址)进行比较。我真的需要那样做吗?这种方法有问题吗?有没有更好的办法?
This post指示C#有一个函数HttpContext.Current.Request.IsLocal来做我所需要的,但我一直无法在perl中找到类似的东西。
我之前在perlmonks.org上使用asked this question(因为我使用的是perl),但没有找到满意的答案。如果有一种解决方案可用于Linux等常用的其他编程语言,例如C,bash或python,那么这样做也足够了。我不需要一种可以保证在任何情况下都能正常工作的解决方案,但是如果它适用于大多数情况,那将会很好。
它也可以指向的IP地址负载均衡器将重写数据包以指向本地机器。 – derobert
第一种情况的随机建议:在您的应用生成的请求中,设置一些自定义HTTP标头。收到请求时检查它,如果存在,则返回错误。请记住,您可以根据需要在自定义标题中放置尽可能多的跟踪信息(例如,请求所经历的所有节点 - 如果node2获得node1请求,则会发送包含node2和node1的标头; Node3应该是OK ,但节点1或节点2会说“否”) – derobert
将包含唯一字符串(例如系统主机ID或CPUID的md5散列)的注释添加到/robots.txt。通过http检索并将其与本地文件系统中的robots.txt进行比较。 –