如何用 URL rewrite 來建置一個正向表列的下載網站?

No Comments /

在網路上常見的 URL rewrite 用法是拿來擋掉非法的使用者,像是偷用網站照片的行為,或者 DDoS 的攻擊等。但有時候,我們需要的是允許特定人士下載的方式,那該怎麼用 URL rewrite 來執行呢?方法如下:

首先,在你的 Apache 設定檔(或 .htaccess)裡面加入這些指令

RewriteEngine   On
RewriteMap      hosts-allow  txt:/full/path/to/hosts.allow
RewriteCond     ${hosts-allow:%{REMOTE_ADDR}|GUEST}    =GUEST
RewriteRule     ^/.*   -       [F]

然後,在 /full/path/to/hosts.allow 裡加入允許IP清單,例如

220.130.128.203 -
71.70.239.144   -

這樣一來,就只有上列的二個IP可以連到網站,其他人都會看到 403 Forbidden 的拒絕連線訊息。

先解釋一下設定檔的意思,

RewriteEngine   On
# 開啟 URL Rewrite Engine

RewriteMap      hosts-allow  txt:/full/path/to/hosts.allow
# 指定開放清單的對應代碼

RewriteCond     ${hosts-allow:%{REMOTE_ADDR}|GUEST}    =GUEST
# 比對連線者的 REMOTE_ADDR 是否存在於開放清單裡,其中
#
%{REMOTE_ADDR} = 訪客的IP
#
%{REMOTE_ADDR}|GUEST 的 | GUEST 代表查無資料時的預設值
#
以 php 的概念來說,$exist = (array_key_exists($user_ip,$hosts)) ? $hosts[$user_ip] : 'GUEST' ;
#
所以 ${hosts-allow:%{REMOTE_ADDR}|GUEST} =GUEST 會成立,就表示IP不在名單裡

RewriteRule     ^/.*   -       [F]
# 這行很單純,就是只要條件成立,不管訪客連到那裡,都回傳 403 的訊息。

那麼,可以怎樣作延伸應用呢?有幾點可以加強的:

  1. 將 hosts.allow 檔案改為捉取 dbm 資料庫,並且將其管理方式與網站邏輯結合,就可以達到動態開放特定訪客使用的目的,以及避免浮動IP的問題。
  2. 在 hosts.allow 的 key/value pairs 中,將 values 改為開放截止時間,而將 =GUEST 的判斷式改以 >%{TIME} 就可以作到有限時間開放的效果。
  3. 將判斷結果寫入系統變數,作為其他 Rewrite 規則的參考,例如將第四行改為 RewriteRule  ^/.*  -  [L,E=expire:1]代表該訪客已經逾時,這個目的是如果網站結構較複雜,需要更多樣的動線時,將有利於各項因素的彙整,並作出最適合的處理方式。
  4. 將回傳 403 Forbidden 的動作改為指向特定網頁,即RewriteRule  ^/.*  ANOTHER_URL_TO_GO   [R]就可以將訪客導向網站上的特定頁面,讓整個流程不至於中斷。

有需要的,自己試玩看看吧~有心得別忘了上來分享喔!^O^

參考網站:mod_rewrite - Apache HTTP Server

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Digg Post to Facebook

Facebook comments:

Leave a Reply

You must be logged in to post a comment.