在 Apache 環境下為網頁資料夾加密

我們想要為Apache伺服器下的目錄限定使用者權限,以保護網頁內容。而我們會使用到.htpasswd、與.htaccess兩這個檔案,來做到這件事情。

學習網頁開發的時候,難免會需要自行架設伺服器在本機上,但一旦為自己的電腦安裝了伺服器之後,只要電腦一連上網,全世界任何人只要使用你在網路上的IP就可以連上你的伺服器。

於是我們想要設定使用者名稱與密碼來保護我們自己的伺服器,以限定能夠瀏覽的使用者。而為了做到這件事,我們會需要兩個檔案:.htpasswd、與.htaccess

為伺服器新增使用者

首先我們需要產生一個存放帳號密碼的.htpasswd檔案,建議是放在網頁根目錄再上層的其他地方以避免他人從網路上存取。

例如要新增的使用者名稱叫做user,產生方法如下。

$ sudo htpasswd -c /path/to/.htpasswd user

此時系統會提示你要輸入密碼,Enter 確定後會要再輸入一次,以確保剛剛輸入密碼正確。

如果你想繼續增加一個使用者叫做user2,可以在終端機再這樣輸入。

$ sudo htpasswd /path/to/.htpasswd user2

你可以為user2設定另一個完全不同的密碼。

.htpasswd檔案裡面,帳號會直接儲存、而密碼會記錄一個用 MD5 算出的雜湊值(看起來就是一個亂碼才不會被發現),所以我們看到剛剛做出來的.htpasswd檔案裡面寫成這樣:

user:$apr1$dxTa0IZA$B8XPOXcm5geDT17eJ2VYf1
user2:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.

分別記錄兩個使用者(useruser2)的帳號與密碼雜湊值,之後伺服器就可以用同樣的算法去做密碼驗證。所以其實如果不用終端機的話,也可以到這個網站來產生我們想要的帳號與密碼雜湊值,一個使用者寫一行,或者你也可以自己寫演算法 XD

保護根目錄

接著我們在想保護的資料夾裡面,新增一個.htaccess檔案寫入以下文字來告訴伺服器:這個目錄需要有權限才能進入,如果該檔案已經存在的話就直接把文字加在裡面。

AuthType Basic
AuthName "My Protected Area"
AuthUserFile /path/to/.htpasswd
Require valid-user

不知道怎麼寫的話,也可以到這個網站把產生的文字存成檔案,直接放在想保護的目錄裡就可以了。

重新整理網頁,搞定……的話就沒問題了,如果仍然不需要密碼可以直接進入的話,繼續往下看。

伺服器設定

在伺服器的設定檔中,找到對應的區塊加入以下設定。端看你要上鎖的網域,這個設定檔可能是在預設的httpd.conf中或者是設定虛擬伺服器的httpd-vhost.conf這個檔案。

<Directory "/absolute/path/to/web/root/dir">
    AllowOverride All
</Directory>

弄好之後,重新啟動伺服器。

$ sudo apachectl restart

再次進入我們自己的網站,搞定!

補充說明

.htaccess檔案內我們剛剛新增的內容,其實要寫在伺服器設定檔也是可以的,可以參考這個網誌

另外,如果想要修改密碼的話,其實就等於再做一次使用者設定,例如我們要修改user2的密碼。

$ sudo htpasswd /path/to/.htpasswd user2

參考資料

  1. DigitalOcean
  2. [教學]對網頁啟用密碼驗證 (Apache) | 辛比誌
  3. 對網頁目錄設定需要帳號密碼來登入 – htaccess @ 黃昏的甘蔗