動機: 在開發網頁資訊系統的時候,我們經常需要讓使用者登入,而且我們希望使用者登入的帳號以及密碼不會在 Internet 傳遞的時候被竊聽或者竊取,這時我們就需要使用 https 來對資料進行加密。可是往往設計一個登入的網頁(例如:login.php),我們不但可以 http://xml.nchu.edu.tw/test/login.php,也可以 https://xml.nchu.edu.tw/test/login.php 來存取。為了確保使用者只能使用 https 來登入,我們需要把所有 http://xml.nchu.edu.tw/test/login.php 的連線都轉成 https://xml.nchu.edu.tw/test/login.php。
- 我們以 Apache2 為範例。你的 Apache2 需要支援 mod_ssl 以及 mod_rewrite,你可以利用
/usr/local/apache2/bin/httpd -l
來列印出你的 Apache2 是否支援 ssl 以及 rewrite 的 modules。如果沒有,你必須先完成安裝手續。 - 備份並修改你的 httpd.conf:請新增下列設定到你的 httpd.conf 內。
01 #RewriteLog /www/logs/rewrite.log 02 #RewriteLogLevel 1 03 04 <Directory "/www/htdocs/test"> 05 RewriteEngine on 06 Options +FollowSymLinks 07 Order allow,deny 08 Allow from all 09 RewriteCond %{SERVER_PORT} !^443$ 10 RewriteRule ^login\.php$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 11 </Directory>
- 第 01 和 02 行的目的是為了使用 mod_rewrite 時的所有 log 的紀錄。如果你沒辦法將 http 的登入網頁自動變成 https,請你將這兩行最前面的 # 拿掉。注意,如果一切都 OK 的話,儘量不要使用 log,因為它會使得 Apache2 慢很多。
- 第 04 和 11 行的目的是為了限定 /www/htdocs/test 這個目錄內的設定才有用。
- 啟動 mod_rewrite 需要第 05、06、07、08 行。
- 第 10 行用來指定當使用者要存取 login.php 這個網頁的時候,Apache2 會將這個連線轉成 https。
- 第 09 行用來指定當使用者經由非 443 這個 port 來存取 login.php 這個網頁的時候,狀況為真。
- 如果我們把第 10 行的 ^login\.php$ 改成 ^.*$ 則代表所有進入 test 這個目錄內的連結都會以 https 的方式完成。
- 重新啟動 httpd。
今天(12/29/2008)發現另一個方式,這個方式僅適用於 Wordpress 的環境。
- Wordpress 2.5 版以後,我們可以在 wp-config.php 中加入
define('FORCE_SSL_ADMIN', true);
的方式。 - 之後,使用 login.php,它會自動進入 https 的連線型態;而且依照我使用的情形來看,這個方式會比之前利用 Apache/mod_ssl/mod_rewrite 的方式來得穩定。
沒有留言:
張貼留言