2011-10-22 51 views
4

我試圖讓一個PHP腳本工作,它將人員的IP與文本文件(每行一個IP)進行比較。如果該人的IP不在文本文件中,那麼他將被重定向到rejected.html。我知道我可以使用.htaccess,但IP列表可能真的很長。如何只允許某些IP查看網頁?

這是代碼,我到目前爲止有:

<?php 
$ipArray = file('ip.txt'); 
unset($allowed); 
foreach ($ipArray as $ipTest) if (substr_count($_SERVER['REMOTE_ADDR'],trim($ipTest))  != "0") $allowed = true; 
if ($allowed != true) { 
header('location: /declined.html'); // the banned display page 
die(); 
} 
?> 

我希望能夠調用的每一頁,我只希望某些IP的看到這個劇本,這就是我想要與調用它:

<? include('ip_allow.php'); ?> 

當我調用了HTML頁面的PHP腳本時,我的IP是不是在ip.txt,它不重定向我/declined.html!我怎樣才能解決這個問題?同樣,我的問題不是如何使用.htaccess,而是如何修復我的腳本!謝謝。

+1

不應該'未設置($允許);'是'$允許= FALSE;'? – animuson

+0

爲什麼不使用'.htaccess'? –

+0

我不想用大量的IP填充htaccess – user1008120

回答

0

file()命令在每行的末尾包含\n字符,因此每行實際上是類似0.0.0.0\n這樣的字符,每次都返回false。

使用此:

$ipArray = file('ip.txt', FILE_IGNORE_NEW_LINES); // Try specifying an ABSOLUTE path to this file. 
$allowed = false; // Rather than unset($allowed), this will prevent notice errors too! 
foreach ($ipArray as $ipTest) if ($_SERVER['REMOTE_ADDR'] == $ipTest) $allowed = true; 

也只是在你的標題行指出,Location應該以大寫字母開頭,你應該指定一個完整的URI到文件:

header('Location: http://example.com/declined.html'); 
+0

它仍然無法正常工作。 – user1008120

+0

你有關閉錯誤報告嗎?如果它不工作,那麼應該會彈出警告或致命錯誤。 – animuson

+0

我正在使用 <?包括( 'ip_allow.php'); ?>

hellooooooo
user1008120

0

我想你有錯誤的目錄中的文件,或PHP不工作或一些其他更基本的配置問題,因爲我測試了你的代碼,它對我來說工作正常。

5

對於IP過濾,最好儘早在處理鏈中完成。在優先順序:

  1. 路由器
  2. 防火牆
  3. Web服務器
  4. 腳本

最有可能你沒有訪問到路由器或防火牆的水平,但你可以使用Apache的mod_rewrite具有使用外部文件的動態塊。設置你的「啓用IP的」文件如下:

a.b.c.d ALLOWED 
b.c.d.e ALLOWED 
c.d.e.f ALLOWED 
etc... 

它基本上是「鍵值」,其中關鍵是IP地址

那麼你的mod_rewrite規則(我數點供參考)

1. RerwriteMap ipfiltermap txt:/path/to/your/ips/list 
2. RewriteCond %{REMOTE_ADDR} (.*) 
3. RewriteCond %{ipfiltermap:%1} !ALLOWED 
4. RewriteCond %{REQUEST_URI} !^/declined.html 
5. RewriteRule .* /forbidden.html [L] 

他們的工作如下:

  1. 定義所允許的IP地址爲「鍵值」對,其中鍵是所有作爲名爲「ipfiltermap」的映射的值,其值爲「允許」,其值爲「ipfiltermap」
  2. 捕獲當前請求的遠程地址(客戶端IP)
  3. 使用步驟2中捕獲的IP,查找它在ipfiltermap,看看IP是否沒有'允許'的字
  4. 明確免除您的'拒絕'頁面從IP執法 - 如果這不是在這裏,disabllowed IP將進入無限重定向循環
  5. 如果所有3個RewriteCond匹配,則用戶來自禁止的IP,並且應該被重定向到fobidden頁面。

所有這些的相關Apache文檔是here

+0

等等,我可以在.htaccess中使用它,它的工作原理是什麼? – user1008120

+0

是的,它可以進入.htaccess或.conf文件。 –

+0

內部服務器錯誤,我把它作爲htaccess的: RerwriteMap ipfiltermap TXT:/ip.txt 的RewriteCond%{REMOTE_ADDR}(*) 的RewriteCond%{ipfiltermap:%1}!允許的 的RewriteCond%{REQUEST_URI}^/declined.html RewriteRule。* /forbidden.html [L] – user1008120

1

如果將配置直接放到Apache配置中,它不會受到.htaccess查找的速度懲罰 - 但這意味着每當列表被修改時都需要重新加載Apache配置。 (雖然Marc's answer可以很好地避免這種情況。)

mod_authz_host.c針對中等快速搜索進行了優化。如果您在每次執行腳本時都在腳本中讀取文本文件,那麼您已經比Apache慢了幾倍。 Apache的讀取配置一次,IP地址轉換爲二進制格式一次,然後可以用非常快的整數運算,以確定是否主機允許。

此外,它已經調試和工作。它會帶你更少的時間來部署它會比找到您當前的代碼錯誤 - 即使如此,當前的代碼會 - 在每次訪問控制的要求 - 重讀(並重新解析爲數組)IP地址的文本描述,將遠程對端的IP地址轉換爲文本版本,然後對整個陣列執行非常慢的基於文本的比較。

如果速度是真正重要的,那麼你就應該調查通過您的系統防火牆做訪問控制。 iptables已經優化了例程以在允許或拒絕的主機列表中查找匹配的IP地址,並且不會浪費任何時間執行任何協議分析。當然,這是一個非常重要的全有或全無方法,如果某些內容可供所有人使用,則需要在偵聽端口之間進行煩人的內容分離。