2009年8月26日 星期三

利用 Apache 製作短址服務

線在網路上有許多網站提供短趾的服務,如: 0rz.twtinyurl.comkuso.cc 等等


那麼,我們能不能自己做呢? 這篇文章的標題是什麼?
這不是廢話嗎 XDDD

我們需要的東西有三個,分別是 Apache、php、MySQL
(Windows的去找個 AppServ 懶人包裝就好了)

安裝並且設定完成之後,先在 MySQL 裡面建立一個 Database,叫什麼名字
自己決定,欄位就是要存短址對應的部份。

好的,那麼接下來我們先用一般 php 會做的方式來達成短址服務。
很簡單,就是使用 GET 來取得對方要求的短址,比如說網頁放在
http://localhost/Shourt.php 而要使用 ID 來取得要求的短趾編號
就是這樣:(假設編號是 ABCXDD)

http://localhost/Shourt.php?ID=ABCXDD



知道我再說什麼吧?反正就是用 GET 的方式送出對 PHP 的請求啦。
這個 php 內容也很簡單,就是取得 $_GET['ID'] 並進入資料庫搜尋,
如果有找到符合的短址,就利用 header("location:目標"); 的方式
重新導向到目標網頁,夠簡單吧?

那麼問題來了,要怎麼寫程式對於這些每天看著螢幕傻笑的設計師,
是超級簡單的,包括取得亂數短址(或使用這自定)、檢查是否已經
被短址化過了.... 等等,都是簡單的。問題是一般的短址服務都是直
接附加在 Host 後面阿比如說: http://0rz.tw/W1A5m 都是直接把
ID (W1A5m)打在後面,而不是還要透過一個 php 轉向....

哈,這個問題就是大家遇到最大的問題,我曾經用 Java 撰寫 Listen
的程式去傾聽 http request,利用這個方法成功將取得的資料導向到
這個 Short.php 中。

但是這個方法變成電腦裡面要有兩個程式在 Listen,既麻煩又不方便。

該怎麼辦? 這篇文章的標題叫什麼? 到目前有看到 Apache 用在哪邊嗎?

沒錯,就是直接用 Apache 來做啦, Apache 本身就是 Web Server 用它來做
不是最好嗎?

那要怎麼做?很簡單, Apache 的設定檔(httpd.conf)是很有趣的,其中有
一個叫做Alias 的功能,可以把取得的 http request 轉到特定位置,而該位
置不一定要在 DocumentRoot 底下,比如在 Linux 上安裝 phpMyAdmin:

Alias /phpmyadmin "/usr/local/www/phpMyAdmin"

/usr/local/www/phpMyAdmin 並不在 DocumentRoot 底下
但是經過這樣撰寫後,只要連到 http://localhost/phpmyadmin 就可以連
到該目錄底下。

不過這是對本機路徑.... 不是對 URL 阿....
這邊就是重點了,要對 URL 做導向的動作,要使用
Redirect 的敘述,他的功能和 Alais 差不多,不過是可以導向到
URL 的,所以說,如果我們要 ABCXDD 對應到
http://www.google.com 的話,那麽我們在設定檔裡面加入這行即可:

Redirect /ABCXDD http://www.google.com

這麼一來連結到 http://localhost/ABCXDD 就會跑到 Google 了。
但是這個方法其實不好,而且根本用不到 php、MySQL。

其實,真正用到的東西是 RedirectMatch。

這個方法可以讓我們根據正規表示式來處理 http request。
在這之前請先確定了解什麼是正規表示式。

OK,那麼我們實際操作看看,首先我們先確定短址的字數
比如說我們規定是 0-9、A~Z、a~z區分大小寫、且字數於
3~6 的字元的,才是短址,那麼我們可以這樣寫,讓從
http request 接收到的資料轉手給 Short.php 處理:

RedirectMatch ^/(\w{3,6})$ http://localhost/Short.php?ID=$1

這邊的意思就是,把以 /開頭,後面接 0~9,A-Z,a~z 三至六個字元結尾的部份
重新導向到 http://localhost/Short.php?ID=$1,其中的 $1 就是前面第一組括號
的部份。也就是說,只要連到:

http://localhost/ABCXDD 就會轉向到 http://localhost/Short.php?ID=ABCXDD

是不是很簡單呢? 接著只要再撰寫好配套的 php 短址服務就大功告成啦!!!

PS:以上這些 Alias、Redirect... 等敘述都要有安裝 mod_alias 模組才可以

關於 mod_alias 的語法,可以到官方網站查看:
http://httpd.apache.org/docs/1.3/mod/mod_alias.html

2 則留言: