壹、伺服器描述

ServerRoot "/etc/httpd" # Apache 配置、錯誤、日誌的根目錄
PidFile run/httpd.pid   # 記啟動時之 pid (process identification number)
Timeout 120             # 回應訪問的最長秒數
KeepAlive Off           # 不准一次連結使用多種請求
MaxKeepAliveRequests 100# 最大連結數目,0代表無限
KeepAliveTimeout 15     # 一次連結中等同一位客戶下一個請求的秒數
Listen 80               # 聽那一個 IP 那一個 port ,此句是聽所有 IP 80 port

<IfModule 模組名>
        ...
</IfModule>
LoadModule 模組名 modules/模組檔名

Include conf.d/*.conf   # 載入配置檔
User apache             # OS中的帳號
Group apache            # OS中的群組
ServerAdmin root@localhost# 伺服器管理員的 Email
UseCanonicalName Off    # 不使用典型的URL[註一]
DocumentRoot "/var/www/html"# 文件根目錄
DirectoryIndex index.html index.htm index.php index.cgi index.html.var# 預設的目錄進入檔
AccessFileName .htaccess# 路徑訪問設定檔的檔名
<Files ~ "^\.ht"> # 允許所有IP讀取路徑訪問設定檔
    Order allow,deny
    Deny from all
</Files>
TypesConfig /etc/mime.types# mime類別定義
DefaultType html/plain  # 預設的回應的mime型別,此設定將隨 HTTP 標頭,送還給訪問客戶
HostnameLookups Off     # 日誌只記訪問者的 IP 不記 Hostname,如 On 就兩者都記
ErrorLog logs/error_log # 指示錯誤日誌
LogLevel warn           # 錯誤日誌應記錄的等級
# 可能是:除錯,訊息,注意,警告,錯誤,攻擊,警報,注解(debug,info,notice,warn,error,crit,alert,emerg)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined# 指示訪問日誌,並指定為combined格式(包含擴展信息)
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
        AllowOverride None
        # Option +ExecCGI# 如果要可以執行 CGI 要把這行打開
        Options None
        Order allow,deny
        Allow from all
</Directory>

AddDefaultCharset UTF-8 # 預設字集。此項會由 HTTP 標頭送還給訪問客戶。
# DefaultLanguage nl    # 通知瀏覽器該用什麼語言,預設為沒有語言且加以註解掉。
# Apache自己沒有依不同語言輸出不同訊息的能力。
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler type-map var
AddType text/html .shtml# 指示 SSI 檔,server-side includes
AddOutputFilter INCLUDES .shtml

註一:UseCanonicalName 打開則使用 ServerName 和 Port 選項的設定值建構完整的URL,並回應客戶,使瀏覽器能得到典型的URL。Off 則 Apache 將使用從客戶請求中獲得 Hostname 和 port (HTTP 1.1的客戶請求中會有這些訊息),重新構建URL。

對所有資料夾進行針對自動產生目錄索引的指示,如:

ServerSignature On              # 目錄列表或回應訪問時顯示伺服器訊息
<IfModule autoindex_color_module>
<IfModule alias_module>
Alias /icons/ "/var/www/icons/" # 指示/var/www/icons/代稱為/icons/
<Directory "/var/www/icons">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
</Directory>
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README.html
HeaderName HEADER.html
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>
</IfModule>

註二:ServerSignature 打開時 autoindex 及回應諎誤訊息時會秀出「Apache/2.2.3 (CentOS) Server at xxx.xxx.xxx.xxx Port xx」,此項可由 .htaccess 中改設。

貳、路徑描述

路徑描述可以在 httpd.conf 中對所有路徑進行通盤描述,或針對特定資料夾進行描述。路徑描述也可以寫在該路徑的 .htaccess 中,,其設定將延伸至子資料夾。對然在 httpd.conf 中的設定決定 .htaccess 生效還是不生效。還要注意 .htaccess 檔案的屬性,必須是 apache 可以讀取的(不是root可以讀取)。

httpd.conf 中的設定,修改後要重啟 Apache 才會生效, .htaccess 中的設定則不用重啟 Apache ,存檔後就會生效。

httpd.conf 中的路徑描述是包在 Directory 標籤中,如:

<Directory 路徑名>
        ...
</Directory>
而 .htaccess 中的描述則不用包在Directory 標籤中。

一、httpd.conf 中對 .htaccess 的指示

利用Apache的rewrite模組對 URL 進行重寫的時候, rewrite 規則會寫在 .htaccess 檔案裡。但要使 apache 能夠正常的讀取.htaccess 檔案的內容,就必須用 AllowOverride 指令對 .htaccess 所在目錄進行配置。

AllowOverride的參數:

  1. None:略過.htaccess,禁止rewrite模組對 URL 進行重寫。
  2. All:所有俱有 “.htaccess” 作用域的指令都允許出現在 .htaccess 檔案中。
  3. AuthConfig:允許使用與認證授權相關的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
  4. FileInfo:允許使用控制文檔類型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文檔元資料的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
  5. Indexes:允許使用控制目錄索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
  6. Limit:允許使用控制主機訪問的指令(Allow, Deny, Order)。
  7. Options[=Option,...]:允許使用控制指定目錄功能的指令(Options和XBitHack)。可以在等號後面附加一個逗號分隔的(無空格的)Options選項清單,用來控制允許Options指令使用哪些選項。

二、路徑的 Options

Options 的參數,可在參數前加上「+」或「-」。Options屬性如果沒有用「+」或者「-」來增加或者減少一個功能的時候,每個之前定義的Options的所有功能都會被取消,直到你又為它指定一些功能。且options屬性在整體設定和虛擬主機設定上並不相關,互相不起作用,因為他們在各自的範圍內被重載了。 所以如果要在虛擬主機裡面使用在整體設定中的Options功能,那麼就不要在虛擬主機設定中指定Options功能;而是用「+」或者「-」符號來增加或者減少功能。 Options的諸參數如下:

  1. All:以下諸功能皆有。
  2. None:以下諸功能皆無。
  3. Indexes:自動產生目錄的索引,將Indexes拿掉,點選連結目錄就不會秀出目錄來,會改成403 forbidden的訊息頁面。
  4. Includes:提供 SSI (Server-Side Inclues) 功能,即使用Apache的指令在html檔中寫程式。須先載入 includes_module 。詳見 http://home.educities.edu.tw/shirock/comp/Apache_SSI.htm 。
  5. FollowSymLinks:遵循符號鏈接,即能夠連到其它的目錄去執行。會壓過SymLinksIfOwnerMatch。
  6. SymLinksIfOwnerMatch:對符號鏈接及其每一層父資料夾,都進行權限檢查,當連結檔本身的owner跟連結目的地的owner不同時拒絕存取。
  7. ExecCGI:可以執行CGI程式。
  8. MultiViews:送出多國語言支援的頁面。此功能必須被明確指定,Options All並不會提供這個功能。

三、限制訪問者

控制目錄和檔案的訪問授權。可以用來對目錄進行限制,也可以對檔案限制訪問者:

<Directory 路徑>                 # 指出該路徑
        Order allow,deny        # 先檢查允許設定,沒有禁止的全部開放
        allow from all          # 允許來自所有ip的訪問
</Directory>

<Files filename.ext>
        order allow,deny
        deny from all
</Files>
<filesmatch "\.tmp">
        order allow,deny
        deny from all
</filesmatch>

先決定使用「Order Deny,Allow」或「Order Allow,Deny」,前者指「先檢查禁止設定,再檢查允許設定」,後者指「先檢允許設定,再檢查禁止設定」。「Deny,Allow」中間只有一個逗號,也只能有一個逗號,有空格都會出錯。

再來設允許和禁止設定,from 除了設定 IP 外,也可以設定 hostname。可以用「Deny from ip1 ip2」「Deny from domain.org」「Deny from All」「Allow from ip1」「Allow from domain.org」「Allow from all」。

Files也可用 regular expression 的,但要加一個 ~ 在前(例:<files ~ "\.xxx$">)。

Files 和 Filesmatch 的用途很多,你不但可以設定 deny,更可以設定個別檔案的密碼,如:

<files abc>
        require user abc
</files>
<files def>
        require user def
</files>

四、控制自動產生目錄索引指令群

一般置於Apache 的 conf/extra/httpd-autoindex.conf 中,再由 httpd.conf 來 include 。當然也可以直接寫在 httpd.conf 中。

可以對所有資料夾進行整體描述,如本文的「壹、伺服器描述」第二段所述。

也可以針對資料夾描述,如:

<Directory "/path/to/you/folder">
        Options Indexes #開啟目錄列表索引模式
        IndexOptions Charset=UTF-8 FancyIndexing HTMLTable VersionSort FoldersFirst ScanHTMLTitles NameWidth=128 DescriptionWidth=256 SuppressLastModified
        # Charset=UTF-8:字集
        # FancyIndexing:針對目錄下不同類型的文檔指定相對應的icon,例如「..」
        # HTMLTable:以HTML表格列表。未設FoldersFirst時,此為列表顯示的預設值
        # VersionSort:版本排序,對於中文來說,是按照拼音順序排序的。預設值
        # FoldersFirst:目錄優先。若設此值,列表改為UL/LI模式,要加HTMLTable才會變表格模式
        # ScanHTMLTitles:搜索HTML標題,?
        # NameWidth:檔名顯示位元組數,寬度可以使用「*」
        # DescriptionWidth:描述顯示位元組數,寬度可以使用「*」
        # SuppressLastModified:取消顯示最近的修改時間,在HTMLTable下有效
        # SuppressSize:取消取消檔案大小。
        AddDescription "註解" 目錄名或檔名      # 加入目錄項之註解
        IndexIgnore header.html footer.html     # 索引排除選項
        HeaderName /data/index/header.html      # 索引頭部嵌入文件
        ReadmeName /data/index/footer.html      # 索引底部嵌入文件
        IndexOrderDefault Ascending Date        # 預設索引排序方式
        ServerSignature Off                     # 關閉頁底的伺服器相關資訊
        DirectoryIndex index.htm                # 目錄索引文件
</Directory>
運用頭部及底部嵌入文件,可以把基本目錄列表完整的嵌入到一個HTML網頁之中。請看以下的演示:
#索引頭部嵌入文件
HeaderName /data/index/header.html 
<!--// 網頁基本信息以及修飾配置部分_Start//-->
<!--// 網頁基本信息以及修飾配置部分_End//-->
<!--// 目錄內容開始顯示部分_Start//-->
<!--// 目錄內容結束顯示部分_EnD//-->
<!--// 其他修飾部分,例如我的美美老婆的圖片啊//-->
#索引底部嵌入文件
ReadmeName /data/index/footer.html 
<!--// 網頁尾部基本信息以及修飾配置部分_Start//-->
<!--// 網頁尾部基本信息以及修飾配置部分_End//-->
生成客製化的目錄列表頁面的過程
  1. 讀取#索引頭部嵌入文件HeaderName /data/index/header.html 並輸出
  2. 服務器生成目錄列表信息並輸出
  3. 讀取#索引底部嵌入文件ReadmeName /data/index/footer.html 並輸出

以上三個部分的輸出組成一個完整的網頁,基本目錄列表信息是動態生成為一段表格的HTML內容,只需要把頁面分割為頭部和尾部,使得基本目錄列表信息剛好嵌入兩者中間,就可以任意定製一個客製性化目錄列表頁面了。

五、路徑描述檔 .htaccess

所有以 "." 開頭的檔名在 Linix like 的OS中為隱藏檔,平常資料夾列表時不出現,所以資安會好一點。但『MS Windows UGI 存檔時不准沒有檔名只有副檔名,一定要求給它一個名字』。解決的方法有兩個:第一是到 ms-dos 的視窗中,按 ren filename.xxx .htaccess ;第二是在上傳到伺服器時才改名做 .htaccess。

.htaccess 是 apache 的產物,IIS 伺服器不支援它,設定的格式是一行一個指令,作用於所在目錄及其子目錄,但 /index.html 不會被它影響。

(一)密碼保護

做出一個名叫 .htpasswd 的檔案(當然可以使用其他檔名,但一般伺服器都會設為 .htpasswd ),放在 http 讀不到的地方。檔案中的的每一句代表一個使用者,使用者名稱以及加密了的密碼是以冒號分隔。而密碼必須經過加密才可以使用。

密碼的製作方法有兩套:一是直接取用 /etc/shadow 檔中Linux作業系統的帳號和密碼,二是使用 htpasswd 程式編製密碼,此程式 Linux 為 /usr/bin/htpasswd ,在 apahce for win32 為 C:\Program Files\Apache Group\Apache\bin\htpasswd.exe。可以製作四種加密碼:crypt、MD5、明碼、SHA1。以「admin:123456」為例,分別長得像以下的例子:

admin:B0fY6cG5e6Vrc
admin:$apr1$VIGJ6...$dg7PoRpQaMdtpTXBFpsfy/
admin:123456
admin:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=

以上四組帳密,第三組的明碼不能當作 .htpasswd 的密碼,其他三組都可以。而 Win32 版本的 htpasswd.exe 不支援 crypt 加密法,只支援 MD5、明碼、SHA1。

有了帳密檔之後就可以在 .htaccess 中,加上以下句子:

AuthName MemberPage     # 當 browser 得知要密碼時所出現的句子,MemberPage可改為其他用字
AuthType Basic          # 千萬別改
AuthUserFile /absolute/path/.htpasswd   # 密碼檔的絕對路徑
require valid-user      # 載入密碼檔所有人
「require valid-user」也可以用「require user username」 或 「require user username1 username2 username3」取代。 也可以指定是某群組才可以,「require group groupname」。此時要再做一個叫 .htgroup 的文字檔,內容如下:
groupname1: username1 username2 username3
groupname2: username1 username3 username4
並在 .htaccess 中加多一句「AuthGroupFile /absolute/path/.htgroup」。

(二)自設錯誤報告

在 .htaccess最後加「ErrorDocument 404 檔名.html」,出404錯誤時要秀出那一個檔給訪問客戶。404 是錯誤碼。以下就是一般會見到的錯誤碼和所代表的錯誤原因:
401:Authorization failed 授權失敗;即是錯誤 password
403:Access denied 存取違規;即是你不可以讀取這個檔案
404:File not found 找不到檔案
500:Internal Server Error 伺服器內部錯誤;可能是 http 伺服器本身是問題,也可能是 CGI 出錯。

也有以下兩類做法:「ErrorDocument 404 "找不到"」及「ErrorDocument 500 http://www.xxx.com/xxx」。

Ps. 如果所用的錯誤文件是一個 CGI 檔,就會有一點關於那個錯誤的資科放到環境變數內給 CGI 讀取。

(三)表現目錄列表

可以使用上述二、三、四段的功能來表現目錄列表

(四)進行php設定

格式為「php_value 設定項 值」,以下的例子可以使php報告錯誤,避過 php.ini 中不顯示錯誤的指示:

php_value display_errors 1

(五)重導向

優點是可以告知蒐尋引擎,網站已搬遷。

  1. Redirect /abc http://www.xxx.com/abcabc
    Redirect permanent /def http://www.xxx.com/def
    browser 要求 http://_____/abc 它就會重新導向至 http://www.xxx.com/abcabc 。 第二句加上 http 的狀態碼 parmanet (301) ,代表是永遠導向, browser 下一次就未必會再找舊檔案,而會直接去找另新網址。 http 的狀態碼除了 permanent 之外,還有 temp (301)、seeother(303) 和 gone(410)。
  2. 也有 RedirectMatch,支援 regular expression。
  3. 舊網址和新網址在同一部主機內,在文件根目錄的 .htxccess 最上面加上下列指令:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^shachi.net.ru$ [NC,OR]
    RewriteCond %{HTTP_HOST} ^www.shachi.net.ru$ [NC,OR]
    RewriteCond %{HTTP_HOST} ^www.shachi.tw$ [NC]
    RewriteRule ^(.*)$ http://shachi.tw/$1 [R=301,L]
    語法說明:
  4. 舊網站在其他主機,要在舊網站文件根目錄的 .htxccess 最上面加上下列指令:
    RewriteEngine On
    RewriteRule (.*) http://shachi.tw/$1 [R=301,L]

參、Virtual Hosting

同一台伺服器可以處理超過一個網域(domain)。分為 IP-based 和 Host-based 兩種。可以將 IP-based 及 Host-based Virtual Hosting 混合使用於同一台 Apache 網頁伺服器中。

一、種類

(一)IP-based

電腦有多個 IP 地址(IP Address),訪問不同的 IP 地址就可以取得不同的網站。TLS/SSL 技術限制了每一個 IP 地址只可以支援一張電子證書(Digital Certificate),所以如果您要在同一部電腦使用多過一張電子證書,您仍然需要 IP-based Virtual Hosting。

(二)Host-based

在 DNS 上多個網域都是指向同一個 IP 地址,網頁瀏覽器(WWW Browser)透過 HTTP 協定告知網頁伺服器要訪問那個網站。

二、設定

(一)指出兩個以上 ip

僅 IP-based 需要。以 root 身份鍵入指令 "ifconfig 介面:編號 IP地址",例如:

# ifconfig eth0:0 192.168.0.101

(二)以 NameVirtualHost 選項,指定要服務多重網域的 ip

在httpd.conf 中進行 NameVirtualHost 選項設定,語法是:

NameVirtualHost IP地址[:]

指定的IP地址可以是 * (任意IP)。接著用多組 VirtualHost 描述區塊來指示各個不同的網域(domain),例如:

NameVirtualHost 192.168.0.1
<VirtualHost 192.168.0.1>
# ...
</VirtualHost>

(三)寫諸 VirtualHost 描述區塊

<VirtualHost *>
        ServerName www.example.net               # 指示域名網址
        # 若多個域名指向相同網站,在 ServerAlias 後加上其他網站別名。別名間以空格間開。
        ServerAlias web.example.net mail.example.net *.example.org
        Alias /xxx  "/var/www/html/xxx"         # 如在域名網址下加路徑,應指向那一個內容存放路徑
        ServerAdmin webmaster@example.net        # 指出網站管理員的Email
        DocumentRoot /var/www/www.examples.net   # 指示網站內容存放路徑
        <Directory /var/www/www.examples.net>      # 描述該路徑
                Options Indexes FollowSymLinks MultiViews# 產生目錄索引,允許瀏覽該目錄內的所有文件
                AllowOverride None      # 略過.htaccess,禁止rewrite模組對 URL 進行重寫
                Order allow,deny        # 先檢查允許設定,沒有禁止的全部開放
                allow from all          # 允許來自所有ip的訪問
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ # 指示 cgi 路徑
        <Directory "/usr/lib/cgi-bin">            # 描述該路徑
                AllowOverride None
                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Allow from all
        </Directory>

        ErrorLog /var/log/apache/error.log      # 指示錯誤日誌
        LogLevel warn                           # 錯誤日誌應記錄的等級
        # 可能是:除錯,訊息,注意,警告,錯誤,攻擊,警報,注解(debug,info,notice,warn,error,crit,alert,emerg)
        CustomLog /var/log/apache/access.log combined
        # 指示該網域的訪問日誌,並指定為combined格式(含擴展信息)
</VirtualHost>

肆、參考資料

  1. apache 從概論、操作到維護詳述
  2. apache 重點講述