【问题标题】:Apache rewrite subnet ip rangeApache 重写子网 ip 范围
【发布时间】:2017-09-20 15:26:30
【问题描述】:

谁能告诉我如何将以下 IP 范围(属于 Cloudfront)放入 mod_rewrite 中? 我希望将 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 

我使用了一个名为 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]

我已经在我的 RewriteCond 条目中添加了所有 IP 范围,但只包括了第一个,因为我不想让这篇文章变得混乱。该规则似乎不起作用。如果我只输入一个 IP 地址,它就可以正常工作。

有人可以检查一下我做错了什么吗?

谢谢! -马

【问题讨论】:

    标签: regex apache mod-rewrite rewrite


    【解决方案1】:

    如果您使用的是 Apache HTTPD 2.4 或更高版本,您还可以使用 expressions 将 REMOTE_ADDR 与 CIDR 掩码直接匹配,而不是将它们转换为正则表达式。

    简写如下:

    RewriteCond expr "-R '192.168.1.0/24'"
    

    以下更长的形式也可用,但文档表明它的效率较低:

    RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"
    

    【讨论】:

    • 可以用RewriteCond expr "! %{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"否定表达式
    【解决方案2】:

    让我们看看第一个范围:

    54.192.0.0/16
    

    在正则表达式中

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

    注意双重||。考虑到调试的难度,即使有一个错误,我也不会觉得丢掉整个东西。

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

    54\.192\.[0-9]{1,3}\.[0-9]{1,3}
    

    而且它很容易阅读。我建议改用它。试试看,如果可行,其他的也可以重新访问。

    我不确定您是如何收到 IP 的,但根据上下文,这是另一种选择:

    RewriteCond %{REMOTE_ADDR} !^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$
    

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

    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}$
    

    【讨论】:

    • 感谢您的评论。我有点困惑如何创建 CIDR 的正则表达式版本。对于 CIDR 54.239.128.0/18,以下内容是否准确: RewriteCond %{HTTP:X-FORWARDED-FOR} !=54\.239\.128\.[1-8]{1,3} ?
    • 谢谢。我无法理解这些正则表达式是如何产生的。这很有帮助。
    • 不客气。这些是由一位拥有很酷工具但不喜欢分享它们的同事制作的,尽管他喜欢炫耀他们可以做什么。 :)
    • 我在 RewriteCond 中添加了所有正则表达式,但由于某些原因来自范围,mod_rewrite 仍然将我重定向到 www.example.com。对于这些范围,我想将呼叫保留为 example.com。想法?
    • 使用正则表达式和^ $锚点指定的范围,我们应该直接使用!,请尝试RewriteCond %{REMOTE_ADDR} !^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$RewriteCond %{HTTP:X-FORWARDED-FOR} !^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$
    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2012-10-06
    • 2012-12-28
    • 1970-01-01
    • 2013-04-20
    • 2021-12-15
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多