我有以下难题。由于我们的服务器堆栈的布局方式:ELB -> Varnish -> Apache
,我需要从X-Forwarded-For
头中提取最右边的非私有IP地址(这是由ELB正确设置的,可以信任)。
我已经使用下面的正则表达式来获取字符串中的最后一个IP地址。我的问题是如何过滤私有IP地址。
((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(?!.*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))
这是我一直在测试的私有IP过滤器。
(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)
请注意,我使用的是正则表达式VMOD,它允许我访问回引用。
请查看下面的示例,该示例将说明我正在努力完成的任务:
92.58.12.100, 10.0.120.5 -> 92.58.12.100
172.24.10.15, 127.0.0.1, 95.58.12.100 -> 95.58.12.100
92.58.12.100 -> 92.58.12.100
另外,下面是一个链接到一个RegExr示例。任何帮助都将不胜感激。
发布于 2016-02-11 17:05:56
使用此模式
.*\b(?!10|127)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
演示
发布于 2018-08-17 06:57:19
alpha bravo的应答点指向正确的方向,但缺少了对私有IP地址空间的正确解析(例如,它在要排除的前缀后面缺少一个点,它将匹配以10开头的任意地址,包括101.*,这不是)。
IPv4私有地址空间是:
10.0.0.0 to 10.255.255.255
172.16.0.0 to 172.31.255.255
192.168.0.0 to 192.168.255.255
修改alpha bravo的答案以包含这些地址(以及以127.*开头的特殊地址)将产生以下正则表达式:
.*\b(?!127\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.|192\.168\.)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
https://stackoverflow.com/questions/35345232
复制相似问题