Apache 2.0手册中文版翻译项目 [本文译者: biAji * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版

 


自定义错误响应 - Apache HTTP服务器
<-
Apache主站 > HTTP服务器 > 文档 > 2.0版本

自定义错误响应

额外的功能可以让网站管理员自己配置Apache对一些错误和问题的响应。

自定义的响应可以定义为当服务器检测到错误或问题时才被激发。

如果一个脚本执行失败并产生了一个“500 Server Error”的响应,那么这个相应可以被更加友好的提示替换或者干脆就用转向语句转到其他的URL(本地或外部的)。

top

行为

老式的行为

NCSA httpd 1.3会回应一些对于用户没有任何意义的无聊的老式错误/ 问题信息,而且不会将产生这些错误的原因存入日志。

新式的行为

服务器可以相应以下请求:

  1. 显示一些其他的文字以代替NCSA硬编码的信息,或者
  2. 转向到本地URL,或者
  3. 转向到一个外部的URL。

当一些信息可以被传递的时候,转向到另外一个URL就变得很有用。这 些信息用于更清楚的解释并且(或者)记录一些错误(问题)产生的原因。

为达到这个目的,Apache将定义一些新的象CGI的环境变量:

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_URLREDIRECT_QUERY_STRING两个变量会传递到新的URL(假定 这个URL是cgi脚本或者是cgi包含页面)。其他变量将仅在发生错误(问 题)之前存在的情况下才存在。如果你的ErrorDocument使 用了外部转向(任何类似于http:开头的 形式,哪怕它仍指向同一个服务器),将没有任何变量将被指 定。

top

配置

AllowOverride进行了相应 的设置后,.htaccess文件将可以使用ErrorDocument

以下是一些示例...

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-digit-code> <action>

action可以代表:

  1. 用于显示的文字。用(")开头的文字。所有之后的文字都将被显示。 请注意:(")本身不会被显示
  2. 作为转向目的外部URL。
  3. 作为转向目的的本地URL。
top

自定义错误回复和转向

Apache转向到URL的行为已经进行了改变,以便对脚本/服务器端包含页 面加入附加的环境变量。

老式的行为

标准CGI变量对于转向的目的脚本来说是可见的。但没有说明转向的来 源。

新式的行为

一批新的环境变量将被初始化并提供给转向目的脚本使用。每个新的 变量都有一个前缀:REDIRECT_REDIRECT_ 环境变量由转向之前的CGI环境变量创建而来,并被加上了 REDIRECT_前缀。比如说HTTP_USER_AGENT变成了 REDIRECT_HTTP_USER_AGENT。在这些新变量之外,Apache 还将定义REDIRECT_URLREDIRECT_STATUS 来帮助脚本确定转向的来源。转向的源URL和目的URL都能被记录到access 日志中。

如果ErrorDocument指定了一个本地转向到CGI脚本,这个脚本中应该 在它的输出中包含"Status:"头部分,用以确保将导致自身被调 用的错误信息返还给客户端。举个例子说:一个Perl的ErrorDocument脚 本应当包含以下代码:

...
print "Content-type: text/html\n";
printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
...

如果有脚本被指定用户处理特定的诸如 404 Not Found这样的错误,它可以用特定的 错误代码和出错文本来替代。

 


项目维护者: kajaa [本文译者: biAji * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版