Apache HTTP Server 版本2.2
Apache可以讓網(wǎng)站管理員自己自定義對一些錯誤和問題的響應(yīng)。
自定義的響應(yīng)可以定義為當(dāng)服務(wù)器檢測到錯誤或問題時才被激活。
如果一個腳本崩潰并產(chǎn)生"500 Server Error"響應(yīng),那么這個響應(yīng)可以被更友好的提示替換或者干脆用重定向語句跳到其他的URL(本地的或外部的)。
Apache1.3 會響應(yīng)一些對于用戶沒有任何意義的錯誤或問題信息,而且不會將產(chǎn)生這些錯誤的原因?qū)懭肴罩尽?/p>
服務(wù)器可以被要求作出如下應(yīng)答:
當(dāng)一些信息可以被傳遞的時候,重定向到另外一個URL就變得很有用。這些信息用于更清楚的解釋和/或記錄一些錯誤或問題產(chǎn)生的原因。
為了達(dá)到這個目的,Apache將定義一些新的類似于CGI環(huán)境變量的環(huán)境變量:
REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/x-xbitmap, image/jpeg
REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.05 9000/712)
REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
REDIRECT_QUERY_STRING=
REDIRECT_REMOTE_ADDR=121.345.78.123
REDIRECT_REMOTE_HOST=ooh.ahhh.com
REDIRECT_SERVER_NAME=crash.bang.edu
REDIRECT_SERVER_PORT=80
REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
REDIRECT_URL=/cgi-bin/buggy.pl
請注意"REDIRECT_
"這個前綴。
至少會有REDIRECT_URL
和REDIRECT_QUERY_STRING
兩個變量會被傳遞到新的URL(假定這個URL是cgi腳本或者是cgi包含頁面)。其他變量將僅在發(fā)生錯誤或問題之前存在的情況下才存在。如果你的ErrorDocument
使用了外部重定向(任何類似于http:
開頭的形式,哪怕它仍指向同一個服務(wù)器),將沒有任何變量被指定。
當(dāng)對ErrorDocument
進行了相應(yīng)的設(shè)置后,將可以在.htaccess
文件中使用AllowOverride
指令。
以下是一些示例...
ErrorDocument 500 /cgi-bin/crash-recover
ErrorDocument 500 "Sorry, our script crashed. Oh dear"
ErrorDocument 500 http://xxx/
ErrorDocument 404 /Lame_excuses/not_found.html
ErrorDocument 401 /Subscription/how_to_subscribe.html
語法如下:
ErrorDocument <3位錯誤代碼> <action>
<action>可以代表:
Apache重定向到URL的行為已經(jīng)進行了修改,以便可以在腳本/服務(wù)器端包含頁面加入額外的環(huán)境變量。
標(biāo)準(zhǔn)CGI變量對于重定向的目的腳本來說是可見的。但沒有說明重定向的來源。
一批新的環(huán)境變量將被初始化并提供給重定向的目標(biāo)腳本。每個新變量都有一個"REDIRECT_
"前綴。REDIRECT_*
環(huán)境變量由重定向之前的CGI環(huán)境變量創(chuàng)建而來,并被加上了"REDIRECT_
"前綴。比如說,HTTP_USER_AGENT
變成了REDIRECT_HTTP_USER_AGENT
。在這些新變量之外,Apache還將定義REDIRECT_URL
和REDIRECT_STATUS
來幫助腳本確定重定向的來源。重定向的源URL和目的URL都能被記錄到訪問日志中。
如果ErrorDocument
指定了一個到本地CGI腳本的重定向,該腳本應(yīng)當(dāng)在它的輸出中包含一個"Status:
"頭字段以確保將導(dǎo)致調(diào)用它的錯誤條件始終返回客戶端。舉例來說,一個Perl ErrorDocument
腳本可能包含如下內(nèi)容:
...
print "Content-type: text/html\n";
printf "Status: %s <中斷條件>\n", $ENV{"REDIRECT_STATUS"};
...
如果該腳本專門用于處理一個特定的錯誤條件,比如:404 Not Found
,它就可以使用特定的代碼和錯誤文本進行替代。
需要注意的是如果應(yīng)答包含一個"Location:
"頭(為了進行一個客戶端重定向),腳本必須發(fā)出一個適當(dāng)?shù)?Status:
"頭(比如:302 Found
)。否則"Location:
"頭可能無效。