Apache重写子网ip范围

Ma *_*iga 7 regex apache mod-rewrite rewrite

有人可以告诉我如何在mod_rewrite中放入以下IP范围(属于Cloudfront)吗?我希望将example.com的非www请求重定向到www.example.com但不重定向来自以下IP范围的任何IP地址:

54.192.0.0/16
54.230.0.0/16
54.239.128.0/18
54.239.192.0/19
54.240.128.0/18
204.246.164.0/22
204.246.168.0/22
204.246.174.0/23 
204.246.176.0/20 
205.251.192.0/19 
205.251.249.0/24 
205.251.250.0/23 
205.251.252.0/23 
205.251.254.0/24 
216.137.32.0/19 
Run Code Online (Sandbox Code Playgroud)

我使用了一个名为rgxg的工具将上述所有内容从CIDR转换为Regex,并在我的httpd.conf中创建了以下条目:

    RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]

    RewriteCond %{HTTP:X-FORWARDED-FOR} !54\.192(\.(25[0-5]|2[0-4][0-9]||1[0-9]{2}|[1-9]?[0-9])){2} 

    RewriteRule ^/(.*)?$ http://www.example.com/$1 [R=301,NC,NE,L]
Run Code Online (Sandbox Code Playgroud)

我在RewriteCond条目中添加了所有ip范围,但仅包括第一个,因为我不想弄乱这篇文章.该规则似乎不起作用.如果我只放一个IP地址,它的工作没有问题.

有人可以检查,看看我做错了什么?

谢谢!-嘛

zx8*_*x81 9

让我们看看第一个范围:

54.192.0.0/16
Run Code Online (Sandbox Code Playgroud)

在正则表达式

54\.192(\.(25[0-5]|2[0-4][0-9]||1[0-9]{2}|[1-9]?[0-9])){2} 
Run Code Online (Sandbox Code Playgroud)

请注意双重||.考虑到调试有多难,如果有一个错误,我不会感到害怕将整个事情抛弃.

以下不完全exact是因为它会匹配片段999,但重要的是它捕获范围内的所有IP,而没有其他有效的IP.确实如此.

54\.192\.[0-9]{1,3}\.[0-9]{1,3}
Run Code Online (Sandbox Code Playgroud)

它很容易阅读.我建议改用它.尝试一下,如果有效,其他的也可以重新访问.

我不确定你是如何收到IP的,但根据具体情况,这是另一种选择:

RewriteCond %{REMOTE_ADDR} !^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$
Run Code Online (Sandbox Code Playgroud)

让我们看看一些潜在的范围:

54.192.0.0/16 => ^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$
54.230.0.0/16 => ^54\.230\.[0-9]{1,3}\.[0-9]{1,3}$
54.239.128.0/18 => ^54\.239\.(?:19[01]|1[3-8][0-9]|12[89])\.[0-9]{1,3}$
54.239.192.0/19 => ^54\.239\.(?:22[0-3]|2[01][0-9]|19[2-9])\.[0-9]{1,3}$
54.240.128.0/18 => ^54\.240\.(?:19[01]|1[3-8][0-9]|12[89])\.[0-9]{1,3}$
204.246.164.0/22 => ^204\.246\.16[4-7]\.[0-9]{1,3}$
204.246.168.0/22 => ^204\.246\.(?:17[01]|16[89])\.[0-9]{1,3}$
204.246.174.0/23  => ^204\.246\.17[45]\.[0-9]{1,3}$
204.246.176.0/20 => ^204\.246\.(?:19[01]|18[0-9]|17[6-9])\.[0-9]{1,3}$
205.251.192.0/19 => ^205\.251\.(?:22[0-3]|2[01][0-9]|19[2-9])\.[0-9]{1,3}$
205.251.249.0/24 => ^205\.251\.249\.[0-9]{1,3}$
205.251.250.0/23 => ^205\.251\.25[01]\.[0-9]{1,3}$
205.251.252.0/23 => ^205\.251\.25[23]\.[0-9]{1,3}$
205.251.254.0/24 =>  ^205\.251\.254\.[0-9]{1,3}$
216.137.32.0/19 => ^216\.137\.(?:6[0-3]|[45][0-9]|3[2-9])\.[0-9]{1,3}$
Run Code Online (Sandbox Code Playgroud)


zts*_*zts 7

如果您使用的是Apache HTTPD 2.4或更高版本,则还可以使用表达式直接将REMOTE_ADDR与CIDR掩码进行匹配,而不是将这些表达式转换为regexp.

简短形式如下:

RewriteCond expr "-R '192.168.1.0/24'"
Run Code Online (Sandbox Code Playgroud)

还提供了以下更长的表单,但文档表明效率较低:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"
Run Code Online (Sandbox Code Playgroud)

  • 可以用`RewriteCond expr "!%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"`否定表达式 (4认同)