如何用 URL rewrite 來建置一個正向表列的下載網站?
8 月 06
網路技術 主機管理 No Comments / 4,182 views
在網路上常見的 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 的訊息。
那麼,可以怎樣作延伸應用呢?有幾點可以加強的:
- 將 hosts.allow 檔案改為捉取 dbm 資料庫,並且將其管理方式與網站邏輯結合,就可以達到動態開放特定訪客使用的目的,以及避免浮動IP的問題。
- 在 hosts.allow 的 key/value pairs 中,將 values 改為開放截止時間,而將 =GUEST 的判斷式改以 >%{TIME} 就可以作到有限時間開放的效果。
- 將判斷結果寫入系統變數,作為其他 Rewrite 規則的參考,例如將第四行改為 RewriteRule ^/.* - [L,E=expire:1]代表該訪客已經逾時,這個目的是如果網站結構較複雜,需要更多樣的動線時,將有利於各項因素的彙整,並作出最適合的處理方式。
- 將回傳 403 Forbidden 的動作改為指向特定網頁,即RewriteRule ^/.* ANOTHER_URL_TO_GO [R]就可以將訪客導向網站上的特定頁面,讓整個流程不至於中斷。
有需要的,自己試玩看看吧~有心得別忘了上來分享喔!^O^