2014-06-28 78 views
5

有人可以告訴我如何把下面的IP範圍(屬於Cloudfront)在mod_rewrite? 我期待example.com的非www請求重定向到www.example.com而不是重定向從IP未來任何IP地址範圍如下:Apache重寫子網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對正則表達式和創建以下條目在我的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地址,它可以毫無問題地工作。

有人可以檢查,看看我做錯了什麼?

謝謝! -Ma

回答

7

讓我們來看看第一個範圍:

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

感謝您的評論。我有點困惑如何創建CIDR的正則表達式版本。對於CIDR 54.239.128.0/18,以下內容是否準確:RewriteCond%{HTTP:X-FORWARDED-FOR}!= 54 \ .239 \ .128 \。[1-8] {1,3}? –

+0

謝謝。我無法理解這些正則表達式是如何產生的。這很有幫助。 –

+0

不客氣。這些是由一位有着很酷工具但不喜歡分享的同事製作的,儘管他喜歡炫耀他們可以做什麼。 :) – zx81

5

如果你使用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'" 
+0

可以用'RewriteCond expr'否定表達式!%{REMOTE_ADDR} -ipmatch'192.168.1.0/24'「' –